递归
1.概述
-
递归:指在当前方法内调用自己的这种现象。
-
递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
-
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归
public class Demo01DiGui {
public static void main(String[] args) {
// a();
b(1);
}
/*
* 3.构造方法,禁止递归
* 编译报错:构造方法是创建对象使用的,不能让对象一直创建下去
*/
public Demo01DiGui() {
//Demo01DiGui();
}
/*
* 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
* 4993
* Exception in thread "main" java.lang.StackOverflowError
*/
private static void b(int i) {
System.out.println(i);
//添加一个递归结束的条件,i==5000的时候结束
if(i==5000){
return;//结束方法
}
b(++i);
}
/*
* 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"
* java.lang.StackOverflowError
*/
private static void a() {
System.out.println("a方法");
a();
}
}
2.累加递归
public class Demo2Recurison {
public static void main(String[] args) {
System.out.println( lj(5));
}
/*
定义一个方法,使用递归计算1-n之间的和
1+2+3+...+n
n+(n-1)+(n-2)+...+1
已知:
最大值:n
最小值:1
使用递归必须明确:
1.递归的结束条件
获取到1的时候结束
2.递归的目的
获取下一个被加的数字(n-1)
*/
private static int lj(int n) {
if(n==1){
//return为中止条件
return 1;
}
return n+lj(n-1);
}
}
3.累乘递归
/*
练习:
使用递归计算阶乘
n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1
*/
public class Demo03Recurison {
public static void main(String[] args) {
System.out.println( jc(3));
}
/*
定义方法使用递归计算阶乘
5的阶乘: 5! = 5*(5-1)*(5-2)*(5-3)*(5-4)=5*4*3*2*1
递归结束的条件
获取到1的时候结束
递归的目的
获取下一个被乘的数字(n-1)
方法的参数发生变化
5,4,3,2,1
*/
private static int jc(int n) {
//确定最终的值返回
if (n==1){
return 1;
}
//获取下一个被乘的数
return n*jc(n-1);
}
}
4.利用递归遍历多级目录
/*
练习:
递归打印多级目录
*/
import java.io.File;
public class Demo04Recurison {
public static void main(String[] args) {
File file = new File("D:\\WorkPlace\\jinjie\\src");
getAllFile(file);
}
public static void getAllFile(File dir){
System.out.println(dir.getName());//dir的toString方法也是调用getName
if(dir.isDirectory()){
for (File s : dir.listFiles()) {
//递归的目的:对下一个文件夹遍历
getAllFile(s);
System.out.println(s);
}
}else {
System.out.println(dir);
}
}
}