递归
* 递归:方法自己调用自己
* 适用于:方法中运算的主体不变,但是运行的时候,参与运行的方法参数会变化
*
* 递归分为两种,直接递归和间接递归。
* 直接递归称为方法自身调用自己。间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
*
* 注意:
* 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
* 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
* 3.构造方法,禁止递归
例:
public class Demo02DiGui {
public static void main(String[] args) {
int i = dgSum(3);
System.out.println(i);
int a = dgJC(5);
System.out.println(a);
}
/*
* 2.3 用递归计算阶乘
* 5阶乘5!=5*4*3*2*1=120
* 计算几的阶乘就是这个数字一直递减相乘到1结束
* 递归的目的:
* 获取下一个被乘的数字:4,3,2,1
* 递归结束的条件:
* 获取到1的时候结束递归
*/
private static int dgJC(int i) {
//获取到1的时候结束递归
if(i==1){
return 1;
}
return i*dgJC(i-1);
}
/*
* 2.2 计算1-n之间的和,使用递归完成
* 100+(100-1)+(100-2)+...+1
* n+(n-1)+(n-2)+..+1
* 递归的目的:
* 获取下一个被加的数字:99,98,97...1
* 递归结束的条件:
* 获取到1的时候结束递归
*/
private static int dgSum(int n) {
//获取到1的时候结束递归
if(n==1){
return 1;
}
//获取下一个被加的数字
return n+dgSum(n-1);
}
/*
* 2.4 递归打印所有子目录中的文件路径
* 编写一个方法用来打印指定目录中的文件路径,并进行方法的调用
* 要求:若指定的目录有子目录,那么把子目录中的文件路径也打印出来
*
* 需求:
* d:\\demo要遍历的文件夹
*/
public class Demo03DiGui {
public static void main(String[] args) {
File file = new File("d:\\demo");
getAllFile(file);
}
/*
* 创建一个方法,传递文件夹的File对象
* 方法内部对这个文件夹进行遍历
*/
private static void getAllFile(File file) {
//先打印一次要遍历的文件夹
System.out.println(file);
File[] files = file.listFiles();
for (File f : files) {
/*
* 判断f如果是一个文件夹,则继续调用getAllFile遍历这个文件夹
* f如果是一个文件,则直接输出
*/
if(f.isDirectory()){
getAllFile(f);//递归
}else{
System.out.println(f);
}
}
}
}