F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2) (n ≥ 2)
數列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
注意:第 0 項為 0,非第 1 項。
#include
int fib_recursive(int n) {
if (n <= 1) return n;
return fib_recursive(n-1) + fib_recursive(n-2);
}
int main() {
int n;
printf("請輸入項數 (0-based):");
scanf("%d", &n);
for (int i = 0; i <= n; ++i) {
printf("%d ", fib_recursive(i));
if (i % 5 == 0) printf("\n");
}
printf("\nF(%d) = %d\n", n, fib_recursive(n));
return 0;
}
0 1 1 2 3 5 8 13 21 34 55 F(10) = 55
O(2^n) 指數級增長。fib(40) 需約 10 億次遞迴呼叫。n,大 n 導致堆疊耗盡。| 方法 | 時間 | 空間 | 代碼複雜度 |
|---|---|---|---|
| 遞迴 (原始) | O(2^n) | O(n) | 極簡 |
| 備忘錄遞迴 (Top-down DP) | O(n) | O(n) | 簡單 |
| 迭代 (Bottom-up DP) | O(n) | O(1) | 簡單 |
| 矩陣快速冪 | O(log n) | O(1) | 中等 |
| 通項公式 (Binet) | O(1) | O(1) | 浮點誤差 |
long long fib_iterative(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;
}
long long memo[100] = {0};
long long fib_memo(int n) {
if (n <= 1) return n;
if (memo[n]) return memo[n];
return memo[n] = fib_memo(n-1) + fib_memo(n-2);
}
F(93) 超過 64 位有號整數範圍。需用大整數庫 (GMP) 或自陣列實現高精度加法。