斐波那契數列定義:F(0)=0, F(1)=1, F(n)=F(n-1)+F(n-2) (n≥2)。遞歸實現極其簡潔但指數級時間複雜度 O(2^n),僅適合教學演示 n≤30 場景。
#include
using namespace std;
// 返回第 n 項 (0-based)
long long fib(int n) {
if (n <= 1) return n; // 基線條件
return fib(n - 1) + fib(n - 2); // 遞歸步驟
}
int main() {
int n;
cout << "輸入項數 n (建議 ≤ 40): ";
cin >> n;
if (n < 0) return 1;
for (int i = 0; i < n; ++i) {
cout << "F(" << i << ") = " << fib(i) << endl;
}
return 0;
}
流程圖使用標準符號 (ISO 5807 / GB/T 4722):
| 符號 | 名稱 | 用途 |
|---|---|---|
| 🟢 橢圓形 | 開始/結束 | 程序入口/出口 |
| 🟦 平行四邊形 | 輸入/輸出 | cin 輸入 n、cout 輸出結果 |
| 🟨 矩形 | 處理/賦值 | 變量初始化、循環計數器更新 |
| 🟧 菱形 | 判斷/決策 | if (n<=1)、for 循環條件、遞歸基線判斷 |
| ➡️ 流向線 | 控制流 | 連接各圖元,標註 True/False |
[開始] (橢圓)
↓
[輸入 n] (平行四邊形)
↓
[初始化 i=0] (矩形)
↓
┌─→ [判斷 i < n?] (菱形) ──否──→ [結束] (橢圓)
│ ↓ 是
│ [調用 fib(i) 輸出結果] (矩形+平行四邊形)
│ ↓
│ [i = i + 1] (矩形)
│ ↓
└────────┘
fib(n) 流程圖 (文字描述版)
[進入 fib(n)] (橢圓/矩形)
↓
[判斷 n <= 1?] (菱形)
├─ 是 → [返回 n] (矩形) → [函數返回] (橢圓)
└─ 否 → [計算 fib(n-1)] (矩形/調用)
↓
[計算 fib(n-2)] (矩形/調用)
↓
[返回 fib(n-1)+fib(n-2)] (矩形)
↓
[函數返回] (橢圓)
flowchart TD
A([開始]) --> B[/輸入 n/]
B --> C[i = 0]
C --> D{i < n?}
D -- 否 --> Z([結束])
D -- 是 --> E[調用 fib(i) 輸出]
E --> F[i = i + 1]
F --> D
subgraph fib_avoid_recursion [fib(n) 遞歸邏輯]
G([fib(n)]) --> H{n <= 1?}
H -- 是 --> I[返回 n]
H -- 否 --> J[調用 fib(n-1)]
J --> K[調用 fib(n-2)]
K --> L[返回 fib(n-1)+fib(n-2)]
end
| 版本 | 時間複雜度 | 空間複雜度 | 關鍵技術 |
|---|---|---|---|
| 朴素遞歸 | O(2^n) | O(n) 棧深度 | 重複計算 |
| 備忘錄遞歸 (Top-down DP) | O(n) | O(n) | 數組/unordered_map 緩存 |
| 底向上迭代 (Bottom-up DP) | O(n) | O(1) | 滾動變量 a,b |
| 矩陣快速冪 | O(log n) | O(1) | 矩陣乘律、二進制指數 |
| 通項公式 (Binet) | O(1) | O(1) | 浮點精度限制 n≤70 |
long long fib_iter(int n) {
if (n <= 1) return n;
long long a = 0, b = 1;
for (int i = 2; i <= n; ++i) {
long long c = a + b;
a = b;
b = c;
}
return b;
}
遞歸斐波那契是理解遞歸基線條件、調用棧、重複子問題的絕佳教具;流程圖則訓練結構化思維、控制流可視化能力。實際工程中請務必使用迭代或矩陣快速冪。掌握從「遞歸定義」到「流程圖」再到「優化實現」的完整鏈路,是算法入門的關鍵一課。