递归
递归:指在当前方法内调用自己的这种现象
分类:
直接递归:方法自身直接调用自己
间接递归:a方法调用b方法,b方法调用a方法。
注意事项:
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出
在递归中虽然有限定条件,但是递归次数不能太多,否则会发生栈内存溢出
构造方法禁止递归
递归的使用前提:
当调用方法时,方法主体不变,每次调用方法的参数不同,可以使用递归
public class Demo01Recursion {
public static void main(String[] args) {
// a(1);
b();
}
//Exception in thread "main" java.lang.StackOverflowError
private static void b() {
b();
}
//在递归中虽然有限定条件,但是递归次数不能太多,否则会发生栈内存溢出
//11268 Exception in thread "main" java.lang.StackOverflowError
private static void a(int i) {
System.out.println(i);
if (i==20000){
return;
}
a(++i);
}
}
练习
使用递归计算1-n的和。
public class Demo02RecursionSum {
public static void main(String[] args) {
// int s = sum(3);
// System.out.println(s);
f(3);
}
/*
定义一个方法,使用递归计算1-n之间的和
1+2+3+4+...+n
已知:
最大值:n
最小值:1
使用递归必须明确:
1.递归的结束条件
获取到1的时候结束
2.递归的目的
获取下一个被加的数字n-1
*/
public static int sum(int n){
if(n==1){
return 1;
}
return n + sum(n-1);
}
public static void f(int n){
int su = 0;
for (int i = 0; i <= n; i++) {
su+=i;
}
System.out.println(su);
}
}
使用递归计算阶乘:n!=n*(n-1)*…21
public class Demo03Recursion {
public static void main(String[] args) {
int d = dd(5);
System.out.println(d);
}
/*
定义方法使用递归计算阶乘
递归结束的条件
获取到1时结束
递归的目的
获取下一个被乘数字(n-1)
* */
private static int dd(int n) {
if (n==1){
return 1;
}
return n * dd(n-1);
}
}
定义一个方法,传递参数File类型的目录
方法对目录进行遍历
public class Demo04Recursion {
public static void main(String[] args) {
File f1 = new File("D:\\IdeaProjects\\basic-code\\day06abstract\\src");
getFile(f1);
}
public static void getFile(File dir){
File[] files = dir.listFiles();
for (File file : files) {
//对遍历到的File对象file进行判断,判断是否是文件夹
if (file.isDirectory()){
//是文件夹,就继续遍历
//直接调用getFile方法即可,递归
getFile(file);
}else {
//file是文件,就直接打印
System.out.println(file);
}
}
}
}