遞歸是「用有限代碼描述無限過程」的強大技術。很多初學者陷入「無限循環」恐懼,實則遞歸只有三個核心要素:**邊界條件、遞推前進、遞推返回**。本文通過兩個經典案例,幫你建立清晰的遞歸心智模型。
返回類型 方法(參數) {
if (邊界條件) return 基礎值; // 1. 邊界:停止遞歸
// 2. 遞推前進:縮小問題規模,調用自身
// 3. 遞推返回:組合子問題結果
return 組合(方法(縮小後參數), ...);
}
數學定義:n! = n × (n-1)!,0! = 1
public static long factorial(int n) {
if (n <= 1) return 1; // 邊界:n=0 或 1
return n * factorial(n - 1); // 遞推:n * (n-1)!
}
調用棧視覺化(n=5):
factorial(5)
5 * factorial(4)
4 * factorial(3)
3 * factorial(2)
2 * factorial(1)
return 1 ← 邊界返回
return 2 * 1 = 2
return 3 * 2 = 6
return 4 * 6 = 24
return 5 * 24 = 120
定義:F(1)=1, F(2)=1, F(n)=F(n-1)+F(n-2) (n≥3)
public static long fibonacci(int n) {
if (n <= 2) return 1; // 邊界:前兩項
return fibonacci(n - 1) + fibonacci(n - 2); // 遞推:兩子問題合併
}
遞歸樹呈指數級增長,大量重複計算(F(3) 被算多次),時間複雜度 O(2ⁿ)。
| 方案 | 時間 | 空間 | 核心思想 |
|---|---|---|---|
| 遞歸 + 備忘錄 | O(n) | O(n) | Map/陣列緩存已計算值 |
| 動態規劃(迭代) | O(n) | O(1) | 自底向上,只保留前兩值 |
| 矩陣快速冪 | O(log n) | O(1) | 數學性質:[[1,1],[1,0]]ⁿ |
遞歸本質是「問題分解 + 邊界收斂」。掌握「寫出邊界 → 寫出遞推關係 → 驗證參數單調縮小」三步法,配合備忘錄/動規優化工具箱,即可駕馭絕大多數遞歸場景。記住:能用迭代解決的,盡量不用遞歸。