递归

递归

  • 定义

    在数学于计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。实际上,递归,顾名思义,其包含两个意思:递 和 归,这正是递归思想的精华所在。递归就是有去(递去)有回(归来)。
    
  • 递归的分类

    1. 直接递归:称为方法自身调用自己的情况。
    2. 间接递归:归结为方法A调用了方法B,方法B调用方法C,C方法反过来调用了方法A。
  • 递归的三要素

    1. 明确递归的终止条件。
    2. 给出递归终止时处理办法。
    3. 提取重复的逻辑,缩小问题规模。
  • 注意事项

    1. 递归一定要有边界条件(条件限定),保证递归能够停止下来,否则会发生栈内存溢出。
    2. 在递归中虽然有限定条件,但是递归的次数不能太多,否则会发生栈内存溢出现象。
    3. 构造方法禁止递归。
  • 练习

    public class RecursionDemo1 {
        public static void main(String[] args) {
            System.out.println(method(10));
            System.out.println(MaxDivisor(11, 12));
            System.out.println(MinMultiple(11, 12));
            System.out.println(method2(9));//9 *8 *7 *6 *5 *4 *3 *2 *1 = 362880
            File file = new File("E:\\尚硅谷Java全套教程\\1.尚硅谷全套JAVA教程--基础阶段");
            method3(file);
            searchTxt(file);
        }
        
    //-------------------------------------------------- 
        //文件搜索 遍历所欲的.txt文件
        //1.目录搜索,无法判断有多少级目录,所以使用递归遍历目录
        public static void searchTxt(File dir) {
            File[] files = dir.listFiles();
            for (File f : files) {
                if (f.isDirectory()) {
                    searchTxt(f);
                } else {
                    String name = f.getName();
                    //windows文件时忽略大小写的
                    name = name.toLowerCase();//大写转换小写
                    if (name.endsWith(".txt")) {//如果末尾是那就输出
                        System.out.println(f);
                    }
    
                }
            }
        }
    
    //--------------------------------------------------
        //使用递归打印多级内存目录
        public static void method3(File file) {
            //首先获取到直接子目录和直接子文件
            File[] files = file.listFiles();
            //遍历
            for (File f : files) {
                //判断如果得到的是一个目录需要再次遍历
                if (f.isDirectory()) {
                    //表明f是一个目录,则继续遍历这个目录
                    //method3这个方法就是获取所有的文件,
                    //参数传递的刚好就是目录,直接调用就可以了
                    method3(f);
                } else {
                    //此时f不是一个目录,肯定是一个文件按
                    System.out.println(f);
                }
    
            }
        }
    //--------------------------------------------------
        //递归求阶乘
        public static int method2(int a) {
            if (a == 1) { //边界条件
                System.out.print(a + " = ");
                return 1;
            } else {
                System.out.print(a + " *");
                return a * method2(a - 1);//获取下一个被乘的数字(n-1)
            }
        }
    //--------------------------------------------------
        //定义两个数相加
        public static int method(int a) {
            if (a == 1) {
                return 1;//出口
            } else {
                return a + (method(a - 1));
            }
        }
    //--------------------------------------------------
        //最大公约数数辗转相除法
        //辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
        public static int MaxDivisor(int a, int b) {
            int max = a > b ? a : b;
            int min = a < b ? a : b;
            if (max % min != 0) {
                return MaxDivisor(max, max % min);
            } else {
                return min;//出口
            }
        }
    
        public static int MinMultiple(int a, int b) {
            //最小公倍数就是他们的乘积除以最大公约数
            return a * b / MaxDivisor(a, b);
        }
    
    }
    
posted @ 2020-12-14 23:38  MikiKawai  阅读(186)  评论(0编辑  收藏  举报