概念:
- 递归指的是方法定义中调用方法本身的现象(自己调自己)
- 把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
- 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算
递归注意事项:
- 递归一定要有出口。否则内存溢出(出口:什么时候不再调用自己)
- 递归虽然有出口,但是递归的次数也不宜过多。否则内存溢出
public static void main(String[] args) {
System.out.println("main");
main(args);
}
递归求和:
计算1 ~ 5的和
public static void main(String[] args) {int sum = getSum(100);System.out.println(sum);}private static int getSum(int i) {if (i == 1) {return 1;} else {return i + getSum(i - 1);}}
递归求阶乘:
讲解:
- 找规律: n的阶乘 = n 乘以 (n-1)的阶乘
- 找出口: 当n==1时,返回1
public static void main(String[] args) {//调用方法int result = jc(5);//输出结果System.out.println("5的阶乘是:" + result);}public static int jc(int n) {//在方法内部判断该变量的值是否是1if (n == 1) {//是:返回1return 1;} else {//不是:返回n*(n-1)!return n * jc(n - 1);}}
文件搜索:
搜索 D:\aaa 目录中的 .java 文件。
//1. 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
//2. 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。public static void main(String[] args) {
// 创建File对象File dir = new File("D:\\aaa");
// 调用打印目录方法printDir(dir);}public static void printDir(File dir) {
// 获取子文件和目录File[] files = dir.listFiles();
// 循环打印for (File file : files) {if (file.isFile()) {
// 是文件,判断文件名并输出文件绝对路径if (file.getName().endsWith(".java")) {System.out.println("文件名:" + file.getAbsolutePath());}} else {
// 是目录,继续遍历,形成递归printDir(file);}}}}