递归介绍、思想、基本使用、求阶乘及递归遍历目录

简介: 递归介绍、思想、基本使用、求阶乘及递归遍历目录的简单示例

 一、递归介绍

递归(recursion)的定义:

递归是一种解决问题的有效方法,在递归过程中,函数将自身作为子例程调用。

递归思想:

简单说程序调用自身的编程技巧叫递归。递归的思想是把一个大型复杂问题层层转化为一个与原问题规模更小的问题,问题被拆解成子问题后,递归调用继续进行,直到子问题无需进一步递归就可以解决的地步为止

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

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

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

递归的基本使用

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);
        }
    }
}

image.gif

递归的注意事项:

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

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

二、递归求阶乘

需求:

用递归求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);
        }
    }
}

image.gif

三、递归遍历目录

需求:

给定一个路径(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());
                }
            }
        }
    }
}

image.gif

目录
相关文章
|
6月前
什么是递归函数?怎样实现递归?
什么是递归函数?怎样实现递归?
|
算法
函数递归(详细解读)(上)
函数递归(详细解读)(上)
函数递归(详细解读)(下)
函数递归(详细解读)(下)
|
6月前
|
Python
Python实现递归的方式来生成斐波那契数列
Python实现递归的方式来生成斐波那契数列
|
1月前
函数的递归
函数的递归
16 0
|
3月前
|
算法
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
【算法】递归总结:循环与递归的区别?递归与深搜的关系?
|
5月前
|
机器学习/深度学习 C语言
|
5月前
|
C语言
C语言函数递归详解:理解递归的原理与应用
C语言函数递归详解:理解递归的原理与应用
108 0
|
6月前
|
C语言
函数递归.
这篇内容介绍了递归的概念,指出在C语言中递归是函数自我调用。它通过一个简单的死递归示例展示了未设置停止条件会导致栈溢出。接着,文章阐述了递归的两个必要条件:存在限制条件以终止递归,以及每次递归调用都更接近这个限制条件。随后,文章通过计算阶乘和顺序打印整数位的例子展示了递归的应用,并对比了递归和迭代的效率,强调在存在冗余计算时,迭代通常比递归更高效。
33 0
|
6月前
|
机器学习/深度学习 算法
详解函数递归
详解函数递归