Java IO流之浅谈递归
程序员文章站
2024-03-04 20:13:48
...
递归
概述
- 指再当前方法内调用自己的这种现象
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个子文件,不能太多,否则运行时直接报栈内存溢出异常
下一篇: eclipse配置javap命令的方法