递归概念
指在当前方法内调用自己的这种现象。
递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 简介递归可以用A方法调用B方法,B方法调用C方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
- 构造方法,禁止递归。
递归的使用前提:
当使用方法的时候,方法的主体不变,每次调用方法的参数不同,可以使用递归。
构造方法,禁止递归的原因:
编译报错:构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接导致编译报错。
练习1:使用递归计算1-n之间的和
代码演示:
package day4;
public class Demo01 {
public static void main(String[] args) {
int s = sum(3);
System.out.println(s);
}
public static int sum(int n){
if (n == 1){
return 1;
}
return n + sum(n-1);
}
}
注意:
使用递归求和,main方法调用sum方法,sum方法会一直调用sum方法。导致在内存中有多个sum方法(频繁的创建方法,调用方法,销毁方法)效率低下。
所以如果仅仅是计算(1-n)之间的和,不建议使用递归,使用for循环即可。
练习2:递归求阶乘
-
阶乘所有小于及等于该数的正整数的积。
代码演示:
package day4; public class Demo02 { public static void main(String[] args) { int s = a(5); System.out.println(s); } public static int a(int n){ if (n == 1){ return 1; } return n * a(n-1); } }
练习3:递归打印多级目录
代码演示:
package day4; import java.io.File; public class Demo03 { public static void main(String[] args) { File file = new File("C:\a"); getAllFile(file); } public static void getAllFile(File dir){ File[] files = dir.listFiles(); for (File f:files){ if (f.isDirectory()){ getAllFile(f); System.out.println(f); }else { System.out.println(f); } } } }
综合案例:文件搜索
需求:
- 遍历多级文件目录,找出所有文件,打印。
- 将文件名转换为字符串,方便判断后缀。
- 使用String方法的endWith方法进行判断。
代码演示:
package day4;
import javax.swing.*;
import java.io.File;
public class Demo04 {
public static void main(String[] args) {
File file = new File("C:\a");
getFile(file);
}
public static void getFile(File dir){
File[] files = dir.listFiles();
for (File f:files) {
if (f.isDirectory()){
getFile(f);
} else {
String s = f.getName();
if (s.endsWith(".java")){
System.out.println(s);
}
}
}
}
}