遞歸是指函數在定義中直接或間接調用自身。解決問題時將大問題分解為結構相同的子問題,直到達到基本情況(基準情況)直接返回結果。
public static int factorial(int n) {
if (n == 1) return 1; // 基準情況
return n * factorial(n - 1); // 遞歸調用
}
執行流程:factorial(3) → 3 * factorial(2) → 3 * (2 * factorial(1)) → 3 * (2 * 1) = 6。
public static int sum(int n) {
if (n <= 0) return 0;
return n + sum(n - 1);
}
public static void toBinary(int n) {
if (n == 0) return;
toBinary(n / 2);
System.out.print(n % 2); // 回溯時輸出,順序正確
}
public static int fib(int n) {
if (n == 0 || n == 1) return n;
return fib(n-1) + fib(n-2);
}
注意:遞歸斐波那契時間複雜度 O(2^n),極低效,實際應用應用動態規劃或矩陣快速冪。
| 特性 | 遞歸 | 迭代 |
|---|---|---|
| 代碼風格 | 聲明式,接近數學定義 | 命令式,循環控制 |
| 空間複雜度 | O(深度) 棧空間 | O(1) 常數空間 |
| 性能 | 函數調用開銷大 | 通常更快 |
| 適用場景 | 樹、圖遍歷、分治、回溯 | 簡單線性計算 |