Java 初识递归

Java 递归

Java 初识递归
  • 什么是递归
  • 递归: 即在成员方法内调用自身
  • 递归的优点
  • 能用简洁的代码解决复杂的问题
  • 递归的缺点
  • 对内存的消耗大
  • 递归的应用场景
  • 当我们要获取一个结果,但是这个结果依赖与上一步一样操作所得到的结果,才能进行运算时,可以使用递归
  • 回溯:有多个选择,但不确定哪个是正确的可以使用递归的回溯现象进行逐一尝试

递归的使用

即在成员方法内调用自身方法

public class ...... {
    // 实例化对象
    Recursion func = new Recursion();
    // 调用 function 方法
    func.function(10);
}

class Recursion {
    public void function (int number) {
        if (number == 1) {
            return;
        }
        System.out.println(number);
    }
}

递归的注意事项

  1. 因为 JVM会为每个调用的方法单独开辟一个临时栈,每调用一次开辟一个,只要方法不结束,这个栈就会一直存在,所以递归的层次不能太多次。
  2. 递归一定要有出口,即:退出条件
  3. 递归必须拥有最少一个形参

递归的经典应用

阶乘

public class ...... {
    // 实例化对象
    Recursion object = new Recursion();
    // 调用 阶层 方法
    object.factorial(10);
}

class Recursion {
    /**
     * @param number 阶乘层数
     * @return 阶层结果
    */
    public int factorial (int number) {
        if (number == 1) {
            // 当 number = 1 时退出递归
            return 1;
        }
        // 利用上一层的结果 来计算
        // factor...(number - 1) * 2
        // factor...(number - 1) * 3
        // factor...(number - 1) * 4......

        return factorial(number - 1) * number;
    }
}

递归的回溯现象

回溯也是递归的常用方法,如:

  • 当前有n个方案,方案1、方案2、方案3……,我们不确定哪个方案是能解决问题
  • 先尝试方案1 方案1能通过执行后续代码
  • 如不同通过尝试方案2以此类推

如寻路案例

public class ...... {
    public static void main (String[] args) {

        Map mapObject = new Map();
        int map[][] = mapObject.genMap(8, 7);
        System.out.println("寻路结果如下:\n" + mapObject.findWay(map, 1, 1));
        // 打印寻路结果
        new Arrayss().printArrays(map);

    }
}

class Map {
    // 用于记录出口位置
    int exportX;
    int exportY;
    /**
     * 生成地图
     * @param row 行
     * @param column 列
     * 0 表示可走
     * 1 表示障碍物
    */
    public int[][] genMap (int row, int column) {
        int map[][] = new int[row][column];
        // 生成一个四边围的地图
        for (int rows = 0; rows < row; rows++) {
            for (int columns = 0; columns < column; columns++) {
                if (rows == 0 || rows == row - 1 || columns == 0 || columns == column - 1) {
                    map[rows][columns] = 1;
                }
            }
        }
        // 随机生成1~10个障碍物
        for (int randomCount = 1; randomCount

Original: https://www.cnblogs.com/jwyqn/p/16243002.html
Author: 假文艺青年。
Title: Java 初识递归

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570042/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Licensing Mode for Remote Desktop Session Host is not Configured

    Licensing Mode for Remote Desktop Session Host is not Configured What is remote desktop li…

    Java 2023年5月30日
    090
  • 《Effective Java 第三版》目录汇总

    经过反复不断的拖延和坚持,所有条目已经翻译完成,供大家分享学习。时间有限,个别地方翻译得比较仓促,希望有疑虑的地方指出批评改正。 第三版全。下回再见,后会有期! Original:…

    Java 2023年5月29日
    085
  • SpringBoot 整合Spring Security + JWT 实现前后端分离项目的认证授权

    以下是伪代码,要根据自己的业务自行修改 引入依赖 还用了jwt、redis、fastjson 等 如果添加了就不用添加 SercurityConfig.java User.java…

    Java 2023年5月30日
    058
  • Spring @ResponseBody 返回中文乱码问题

    今天在使用spring 的时候,发现中文返回的是乱码。 经过研究发现,主要是@ResponseBody 引起的。主要是由于 @ResponseBody 返回字符串结果的时候,使用了…

    Java 2023年5月30日
    061
  • session,model,request,servletContext

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月6日
    081
  • 整数四则运算计算器

    如题 import java.util.Scanner; public class Calculator { public static void main(String[] ar…

    Java 2023年6月9日
    072
  • 【SpringCloud-Alibaba系列教程】5.负载均衡

    一、介绍 上一章我们简单的说了一下关于Nacos的使用,这次我们首先做从Nacos获取微服务地址和端口的操作,然后再进行引出负载均衡的问题。 二、我们开始吧 首先我们在订单Cont…

    Java 2023年6月5日
    090
  • 【Nacos】最新版本 Spring Cloud Alibaba nacos 负载均衡调用异常 没有找到对应主机

    问题原因:最新版本的 Nacos 中没有依赖任何负载均衡的包, 解决办法:需要手动引入 Ribbon 或者 LoadBalancer,这里建议引入 LoadBalancer,因为 …

    Java 2023年6月15日
    077
  • 2.Mybatis-常用sql

    1.Mybatis常用select语句 SELECT sr.ROLE_ID AS roleId, sr.ROLE_NAME AS roleName, sr.IS_ACTIVE AS…

    Java 2023年6月13日
    073
  • Bootstrap相关方法,事件整理

    相关方法 这些方法的调用方法主要是 $(‘#bsTableTest’).bootstrap(”,) 常用的方法有以下: 获取表格的一些基本属性,返回一个 object, key有…

    Java 2023年6月9日
    069
  • MQ 问题详解

    MQ 优缺点以及对应的解决方案 posted @2021-09-01 14:56 FrankYou 阅读(70 ) 评论() 编辑 Original: https://www.cn…

    Java 2023年5月30日
    071
  • vscode运行C/C++及基础设置(超简单详细)

    vscode运行C/C++及基础设置(超简单详细) 文章目录 vscode运行C/C++及基础设置(超简单详细) * 链接 – 教程链接 vscode下载官网 ming…

    Java 2023年6月5日
    0130
  • 调试webpack

    调试webpack 1. 摘要 用过构建工具webpack的朋友应该都体会,面对其几百行的配置内容如大海一小舟,找不到边。看文档查百度,对其构建的生命周期看了又看。最终还是很茫然。…

    Java 2023年6月13日
    057
  • 线程池底层原理详解与源码分析

    【1】为什么要使用线程池? 示例演示: 示例结果: 采用每次都开一个线程的结果是292毫秒,而线程池的是69毫秒。(随着业务次数的增多这个数值的差距会越大) 示例说明: 如果每个请…

    Java 2023年6月16日
    091
  • 万字剖析OpenFeign整合Ribbon实现负载均衡的原理

    大家好,前面我已经剖析了OpenFeign的动态代理生成原理和Ribbon的运行原理,这篇文章来继续剖析SpringCloud组件原理,来看一看OpenFeign是如何基于Ribb…

    Java 2023年6月16日
    087
  • 基本工具git和maven

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月13日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球