递归
定义
递归是一种编程方法,指函数调用自身的过程。在Java中,递归通过方法调用自身来实现,通常用于处理具有层级结构的数据。
作用
递归在实际开发中具有以下重要价值:
- 处理层级数据:处理菜单、文件目录等层级结构
 - 代码简化:使代码结构更清晰简洁
 - 问题分解:将复杂问题分解为相同类型的子问题
 - 数据遍历:遍历树形结构的数据
 - 状态管理:处理具有递归特性的状态
 
图表说明
递归调用流程
graph TD
    A(("开始")) --> B["fibonacci(n)"]
    B --> C{"n <= 1?"}
    C -->|是| D[return n]
    C -->|否| E["fibonacci(n-1)"]
    E --> B
    E --> F["fibonacci(n-2)"]
    F --> B
    D --> G(("结束"))
例子
斐波那契数列定义
F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
public class FibonacciRecursionDemo {
    public static void main(String[] args) {
        // 测试斐波那契数列的前10个数
        System.out.println("斐波那契数列前10个数:");
        for (int i = 0; i < 10; i++) {
            System.out.print(fibonacci(i) + " ");
        }
        System.out.println();
        // 测试特定位置的斐波那契数
        int n = 7;
        System.out.println("第" + n + "个斐波那契数是:" + fibonacci(n));
    }
    // 递归计算斐波那契数
    public static int fibonacci(int n) {
        // 基本情况:当n为0或1时,直接返回n
        if (n <= 1) {
            return n;
        }
        // 递归情况:F(n) = F(n-1) + F(n-2)
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
执行结果
斐波那契数列前10个数:
0 1 1 2 3 5 8 13 21 34 
第7个斐波那契数是:13
目录遍历示例
import java.io.File;
public class DirectoryTraversalDemo {
    public static void main(String[] args) {
        // 要遍历的目录路径(请替换为实际路径)
        String path = "/Users/emac/Documents/Develop/Edu/Java/Demo";
        File rootDir = new File(path);
        System.out.println("目录结构:");
        traverseDirectory(rootDir, 3);
    }
    /**
     * 递归遍历目录结构
     * @param dir 当前目录
     * @param level 目录层级(用于缩进)
     */
    public static void traverseDirectory(File dir, int level) {
        // 基本情况:如果是文件直接打印
        if (dir.isFile()) {
            printIndent(level);
            System.out.println("📄 " + dir.getName());
            return;
        }
        // 递归情况:处理目录
        printIndent(level);
        System.out.println("📁 " + dir.getName() + "/");
        File[] files = dir.listFiles();
        if (files != null) {
            for (File file : files) {
                traverseDirectory(file, level + 1);
            }
        }
    }
    // 打印缩进
    private static void printIndent(int level) {
        for (int i = 0; i < level; i++) {
            System.out.print("  ");
        }
    }
}
执行结果示例
- 输出结果只是展示,可以修改 String path = "/path/to/directory"; 执行看看效果
目录结构: 📁 project/ 📁 src/ 📁 main/ 📄 Main.java 📄 Config.properties 📁 test/ 📄 TestCases.java 📁 docs/ 📄 README.md 📄 pom.xml 
详细说明
- 
递归的基本要素:
- 基本情况:n <= 1时直接返回n
 - 递归情况:计算n-1和n-2的斐波那契数
 - 递归调用:调用自身计算子问题
 - 结果合并:将子问题的结果相加
 
 - 
递归的应用场景:
- 数学计算
 - 树形结构处理
 - 动态规划
 - 分治算法
 - 图形生成
 
 - 
目录遍历实现要点:
- 使用File类处理文件系统操作
 - 递归终止条件:遇到文件时直接返回
 - 目录处理:列出所有子项并递归调用
 - 层级缩进:通过level参数控制显示格式
 
 
推演说明
- 递归执行流程:
- 检查基本情况(n <= 1)
 - 递归计算F(n-1)
 - 递归计算F(n-2)
 - 合并结果返回
 
 
注意事项
- 确保有终止条件(n <= 1)
 - 注意递归深度(避免栈溢出)
 - 考虑性能影响(重复计算问题)
 - 可以使用记忆化递归优化
 - 对于大数计算,考虑使用迭代方法
 - 文件操作注意事项:
- 需要处理文件权限问题
 - 注意空目录处理
 - 路径需要存在否则会返回null
 - 建议添加异常处理机制
 
 - 注意Java版本兼容性:
- String.repeat()需要Java 11+
 - 低版本请使用循环实现缩进