Java IO流之浅谈递归

在这里插入图片描述

递归

概述

  • 指再当前方法内调用自己的这种现象
public static void main(String[] args){
	a();
}

public static void a(){
	a();
}

递归分类

  • 递归分为两种,直接递归和间接递归
  • 直接递归就是自己方法调用自己
  • 间接递归可以理解为 A方法调用B方法,B方法调用C方法,C方法调用A方法
public static void a(){
	b();
}

public static void b(){
	c();
}

public static void b(){
	a();
}

注意事项

  • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
  • 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出
  • 构造方法,禁止递归

为什么会导致栈内存溢出!!!

a方法会在栈内存中一直调用a方法,就会导致栈内存中有无数个a方法
方法太多,超出栈内存的大小,就会导致内存溢出的错误
当一个方法调用其他方法的时候,调用方法如果没有执行完毕,被调用方法就会一直执行,执行完毕才会,才会继续执行

使用前提

  • 当调用方法的时候,方法的主体不变,每次调用方法参数不同,可以使用递归
public class Demo01Recursion {

    public static void main(String[] args) {

        recursion(1);

    }

    private static void recursion(int i) {
        System.out.println(i);
        if (i == 10000) {
            return;
        }
        recursion(++i);
    }
}
  • 构造方法中,不准使用递归,编译期就会报错

Demo 案例- 1

  • 计算出1+n的结果 ,n是要传递的参数,如果n=3 结果就是 1+2+3的结果
public class Demo02Recursion {

    public static void main(String[] args) {
		// 1+2+3.....+100=
		int num = num(100);
        System.out.println(num);
    }

    private static int num(int i) {
        if (i == 1) {
            return 1;
        }
        return i + num(i - 1);
    }
}

结果就是 5050

分析一下运行情况

栈内存就是这样的情况

在这里插入图片描述

Demo 案例- 2

  • 打印盘符下所有子文件和子文件夹
public class Demo03Recursion {
    public static void main(String[] args) {
        // 模拟打印文件夹下所有文件和文件夹
        getAllFile(new File("D:\\software"));

    }

    public static void getAllFile(File dir) {
        // 打印目录名称
        System.out.println(dir);
        File[] files = dir.listFiles();
        for (File file : files) {
            // 如果是文件夹
            if (file.isDirectory()) {
                getAllFile(dir);
            } else {
                // 打印文件
                System.out.println(file);
            }
            System.out.println(file);
        }
    }
}

为此Demo专门建了3个文件夹和3个子文件,不能太多,否则运行时直接报栈内存溢出异常

发布了24 篇原创文章 · 获赞 33 · 访问量 2391

猜你喜欢

转载自blog.csdn.net/weixin_41241629/article/details/104306416