樓梯共 N 級(N ≥ 0)。每步可跨 1 級或 2 級。求從底到頂的不同走法總數。
輸入 N,若 N > 20 則取 N % 21(保證 0 ≤ N ≤ 20)。若取模後為 0,輸出 1。
int climb_rec(int n) {
if (n <= 1) return 1;
return climb_rec(n-1) + climb_rec(n-2); // 大量重複計算
}
int climb_iter(int n) {
if (n <= 1) return 1;
int a = 1, b = 2; // F(1), F(2)
for (int i = 3; i <= n; i++) {
int c = a + b;
a = b;
b = c;
}
return b;
}
int memo[21] = {0};
int climb_memo(int n) {
if (n <= 1) return 1;
if (memo[n]) return memo[n];
return memo[n] = climb_memo(n-1) + climb_memo(n-2);
}
#include
int main() {
int n;
scanf("%d", &n);
n %= 21;
if (n == 0 || n == 1) { printf("1\n"); return 0; }
int f0 = 1, f1 = 2; // F(1), F(2)
for (int i = 3; i <= n; i++) {
int tmp = f0 + f1;
f0 = f1;
f1 = tmp;
}
printf("%d\n", f1);
return 0;
}