Java递归

简介: Java递归

1 递归【应用】

递归的介绍

以编程的角度来看,递归指的是方法定义中调用方法本身的现象

把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解

递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算

递归的基本使用

public class DiGuiDemo {
    public static void main(String[] args) {
//回顾不死神兔问题,求第20个月兔子的对数
//每个月的兔子对数:1,1,2,3,5,8,...
        int[] arr = new int[20];
        arr[0] = 1;
        arr[1] = 1;
        for (int i = 2; i < arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        System.out.println(arr[19]);
        System.out.println(f(20));
    }
    /*
    递归解决问题,首先就是要定义一个方法:
    定义一个方法f(n):表示第n个月的兔子对数
    那么,第n-1个月的兔子对数该如何表示呢?f(n-1)
    同理,第n-2个月的兔子对数该如何表示呢?f(n-2)
    StackOverflowError:当堆栈溢出发生时抛出一个应用程序递归太深
    */
    public static int f(int n) {
        if(n==1 || n==2) {
            return 1;
        } else {
            return f(n - 1) + f(n - 2);
        }
    }
}

递归的注意事项

递归一定要有出口。否则内存溢出

递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出

2递归求阶乘【应用】

案例需求

用递归求5的阶乘,并把结果在控制台输出

代码实现

public class DiGuiDemo01 {
    public static void main(String[] args) {
//调用方法
        int result = jc(5);
//输出结果
        System.out.println("5的阶乘是:" + result);
    }
    //定义一个方法,用于递归求阶乘,参数为一个int类型的变量
    public static int jc(int n) {
//在方法内部判断该变量的值是否是1
        if(n == 1) {
//是:返回1
            return 1;
        } else {
//不是:返回n*(n-1)!
            return n*jc(n-1);
        }
    }
}

3 递归遍历目录【应用】

案例需求

给定一个路径(E:\itcast),通过递归完成遍历该目录下所有内容,并把所有文件的绝对路径输出在控制台

代码实现

public class DiGuiDemo02 {
    public static void main(String[] args) {
//根据给定的路径创建一个File对象
// File srcFile = new File("E:\\itcast");
        File srcFile = new File("E:\\itheima");
//调用方法
        getAllFilePath(srcFile);
    }
    //定义一个方法,用于获取给定目录下的所有内容,参数为第1步创建的File对象
    public static void getAllFilePath(File srcFile) {
//获取给定的File目录下所有的文件或者目录的File数组
        File[] fileArray = srcFile.listFiles();
//遍历该File数组,得到每一个File对象
        if(fileArray != null) {
            for(File file : fileArray) {
//判断该File对象是否是目录
                if(file.isDirectory()) {
//是:递归调用
                    getAllFilePath(file);
                } else {
//不是:获取绝对路径输出在控制台
                    System.out.println(file.getAbsolutePath());
                }
            }
        }
    }


目录
相关文章
|
Java
java中递归实例
java中递归实例
134 0
|
Java
java基础(11)函数重载以及函数递归求和
Java支持函数重载,即在同一个类中可以声明多个同名方法,只要它们的参数类型和个数不同。函数重载与修饰符、返回值无关,但与参数的类型、个数、顺序有关。此外,文中还展示了如何使用递归方法`sum`来计算两个数之间的和,递归的终止条件是当第一个参数大于第二个参数时。
101 1
java基础(11)函数重载以及函数递归求和
|
算法 Java
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
java使用递归及迭代方式实现前序遍历 中序遍历 后序遍历 以及实现层序遍历
199 7
|
Java
蓝桥杯Java组暴力递归搜图
蓝桥杯Java组暴力递归搜图
94 4
java实现斐波那契数列(递归、迭代、流)
java实现斐波那契数列(递归、迭代、流)
253 1
|
算法 前端开发 Java
探讨Java中递归构建树形结构的算法
探讨Java中递归构建树形结构的算法
332 1
|
Java
Java递归:深入理解与应用
Java递归:深入理解与应用
154 1
|
Java
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配...
<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配
124 2
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
算法 Java
Java程序设计基础——递归
Java程序设计基础——递归