樓梯有 n 階,每步可跨 1 階或 2 階,求不同走法總數。輸入 n,輸出走法數。
f(1) = 1(只能跨 1 階)f(2) = 2(1+1 或 2)f(n) = f(n-1) + f(n-2)(最後一步是 1 階或 2 階)這正是費波那契數列平移版:f(n) = Fib(n+1)
#include <stdio.h>
int climbStairs(int n) {
if (n == 1) return 1;
if (n == 2) return 2;
return climbStairs(n-1) + climbStairs(n-2);
}
int main() {
int n;
printf("輸入樓梯階數 (n>0): ");
scanf("%d", &n);
printf("上 %d 階樓梯有 %d 種走法。\n", n, climbStairs(n));
return 0;
}

| 方法 | 時間複雜度 | 空間複雜度 | 備註 |
|---|---|---|---|
| 遞迴(無記憶化) | O(2ⁿ) | O(n) | 大量重複計算,n>40 極慢 |
| 遞迴+備忘錄 | O(n) | O(n) | 陣列緩存中間結果 |
| 動態規劃(迴圈) | O(n) | O(1) | 僅保留前兩項,最優 |
| 矩陣快速冪 | O(log n) | O(1) | 大 n 時最快 |
int climbStairsDP(int n) {
if (n <= 2) return n;
int a = 1, b = 2, c;
for (int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return b;
}
f(n) = Σ f(n-i)理解遞迴到迭代的轉換,是演算法優化的核心功力。