# 第39级台阶 小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢? 请你利用计算机的优势,帮助小明寻找答案。 以下错误的一项是? ## aop ### before ```c #include using namespace std; ``` ### after ```c ``` ## 答案 ```c int ans = 0; int sum = 0; vector a(40, 0); void dfs(int steps) { if (sum >= 39) { if ((steps - 1) % 2 == 0 && sum == 39) ans++; return; } for (int i = 1; i <= 2; i++) { a[steps] = i; sum += i; dfs(steps + 1); sum -= i; } } int main() { dfs(0); cout << ans << endl; return 0; } ``` ## 选项 ### A ```c int ans = 0; void dfs(int k, int n) { if (k == 39 && n % 2 == 0) { ans++; } if (k > 39) return; dfs(k + 1, n + 1); dfs(k + 2, n + 1); } int main() { dfs(0, 0); printf("%d\n", ans); return 0; } ``` ### B ```c int countt = 0; void f(int stair, int step) { if (stair < 0) return; if (step % 2 == 0 && stair == 0) { countt++; return; } for (int i = 1; i <= 2; i++) { f(stair - i, step + 1); } } int main(void) { f(39, 0); cout << countt << endl; return 0; } ``` ### C ```c #define LEFT 0 #define RIGHT 1 using namespace std; int stage[40][2]; int main() { int i; stage[1][LEFT] = 1; stage[1][RIGHT] = 0; stage[2][LEFT] = 1; stage[2][RIGHT] = 1; for (i = 3; i <= 39; i++) { stage[i][LEFT] = stage[i - 1][RIGHT] + stage[i - 2][RIGHT]; stage[i][RIGHT] = stage[i - 1][LEFT] + stage[i - 2][LEFT]; } cout << stage[39][RIGHT] << endl; return 0; } ```