Java 递归的简单学习与理解
递归概述
概念:指在当前方法内调用自己的这种现象。
递归的分类:递归分为两种,直接递归和间接)递归。
- 直接递归称为方法自身调用自己
- 间接递归可以A方法调用B方法,B方法调用方法,C方法调用A方法。
注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
- 在递归中虽然有限定条件,但是递归次数不能太多,否则也会发生栈内存溢出。
- 构造方法,禁止递归。
假如有方法A,没有限制,不断的递归A方法,那么分配的栈内存中就有无数个A方法,最终导致栈内存溢出。构造方法中不可以递归,因为构造方法是创建对象使用的,一直递归会导致内存中有无数多个对象,直接编译报错。
使用递归计算1~n之间的和
public class DemoSum {
    public static void main(String[] args) {
        System.out.println(sum(100));
    }
    public static int sum(int n) {
        if (n == 1) {
            return 1;
        }
        return n + sum(n - 1);
    }
}
控制台输出:
5050
使用递归来计算n的阶乘
public class DemoFactorial {
    public static void main(String[] args) {
        System.out.println(sum(10));
    }
    public static int sum(int n) {
        if (n > 1) {
            return n * sum(n - 1);
        }
        return 1;
    }
}
控制台输出:
3628800
递归打印多级目录下的文件
import java.io.File;
public class DemoFileAndDirectory {
    public static void main(String[] args) {
        File file = new File("/AAA/BBB/CCC/");
        ergodic(file);
    }
    /**
     * 遍历输出文件夹下的的文件,倘若给定的是一个文件,直接输出该文件
     * @param file 文件或文件夹
     */
    public static void ergodic(File file) {
        // 是否存在该目录或文件
        if (file.exists()) {
            // 存在该目录或文件,获取该目录下的所有目录和文件
            File[] files = file.listFiles();
            // 遍历该目录下的文件或目录
            for (File f : files) {
                // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                if (f.isDirectory()) {
                    ergodic(f);
                } else {
                    System.out.println(f.getAbsolutePath());
                }
            }
        } else {
            if (file.isFile()) {
                System.out.println("不存在该文件");
            } else {
                System.out.println("不存在该目录");
            }
        }
    }
}
控制台输出:
不存在该目录
递归打印多级目录下的.java文件
import java.io.File;
public class Demo02FileAndDirectory {
    public static void main(String[] args) {
        File file = new File("/Users/liyihua/IdeaProjects/Study/src/view/study");
        ergodic(file);
    }
    /**
     * 遍历输出文件夹下的的.java文件,倘若给定的是一个文件,且是.java为后缀的文件,直接输出该文件
     * @param file 文件或文件夹
     */
    public static void ergodic(File file) {
        // 是否存在该目录或文件
        if (file.exists()) {
            // 存在该目录或文件,获取该目录下的所有目录和文件
            File[] files = file.listFiles();
            // 遍历该目录下的文件或目录
            assert files != null;
            for (File f : files) {
                // 该目录下,如果是目录,使用递归。如果是文件,直接输出。
                if (f.isDirectory()) {
                    ergodic(f);
                } else if (f.getName().endsWith(".java")) {
                    System.out.println(f.getName());
                }
            }
        } else {
            if (file.isFile()) {
                System.out.println("不存在该文件");
            } else {
                System.out.println("不存在该目录");
            }
        }
    }
}
控制台输出所有后缀名为java的文件
本文来自博客园,作者:LeeHua,转载请注明原文链接:https://www.cnblogs.com/liyihua/p/12247390.html

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号