經典問題:一對兔子出生後第 3 個月開始每月產一對小兔子,小兔子長到第 3 個月後也按此規律繁殖。假設兔子不死,求第 n 個月兔子總對數。
設 f(n) 為第 n 月兔子對數:
這正是斐波那契數列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...
#include <stdio.h>
int fib(int n) {
if (n <= 2) return 1;
return fib(n-1) + fib(n-2);
}
int main() {
int target;
scanf("%d", &target);
int month = 1;
while (fib(month) < target) month++;
printf("%d\n", month); // 輸出達到目標對數所需月數
return 0;
}
| 方法 | 時間複雜度 | 空間複雜度 | 適用場景 |
|---|---|---|---|
| 遞歸 | O(2^n) 指數級 | O(n) 棧深度 | n ≤ 30 教學演示 |
| 迭代/動態規劃 | O(n) 線性 | O(1) 或 O(n) | 實際工程、大 n |
| 矩陣快速冪 | O(log n) | O(1) | 極大 n (10^9+) |
| 通項公式 | O(1) | O(1) | 需高精度浮點 |
int fib_iter(int n) {
if (n <= 2) return 1;
int a = 1, b = 1, c;
for (int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
ZJU PAT Basic Programming - 循環-05 兔子繁衍問題
斐波那契數列不僅出現在兔子繁殖模型中,還廣泛存在於自然界:向日葵種子排列、松果螺旋、貝殼結構、銀河旋臂等。在計算機科學中,它是動態規劃、遞歸優化、黃金分割搜索等算法的經典教學案例。