MOOC清華《程式設計基礎》第6章第1題:n級臺階問題(遞推法)
阿新 • • 發佈:2019-01-27
題目描述
下n級臺階,每步可下1級或2級臺階。那麼從n級臺階下到地面,共有多少種不同的下臺階方案?
輸入:n
輸出:方案數
輸入格式多行輸入,每一行輸入一個正整數n,表示n級臺階
輸出格式每一行輸出n級臺階的方案數
樣例輸入1 2樣例輸出
1 2
DevCpp可以編譯通過,而學堂線上OJ系統不通過的程式碼:
#include <iostream> using namespace std; int N = 10; //臺階數,方便可調 int main() { int n[N] = {0}; int i = 0; while(cin>>n[i]) //輸入臺階數 i++; int scheme_1 = 1, scheme_2 = 2; //給最簡單的兩種方案賦初值 int scheme[N] = {0}; int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用陣列遞推,節約記憶體空間 for(int j = 0; j < i; j++) { qian_xiang = scheme_1; shang_xiang = scheme_2; if(n[j] >= 3) { for(int k = 3; k <= n[j]; k++) { ben_xiang = shang_xiang + qian_xiang; qian_xiang = shang_xiang; shang_xiang = ben_xiang; //遞推公式,這個規律在草稿紙上推得 } scheme[j] = ben_xiang; } if(n[j] == 1) scheme[j] = scheme_1; if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意迴圈變數和陣列下標 } for(int j = 0; j < i; j++) cout << scheme[j] << endl; return 0; }
錯誤提示如下:
Main.cpp: In function 'int main()':
Main.cpp:9:15: error: variable-sized object 'n' may not be initialized
int n[N] = {0};
^
Main.cpp:14:20: error: variable-sized object 'scheme' may not be initialized
int scheme[N] = {0};
^
經查,這是因為OJ編譯器版本比較老舊造成的,定義陣列大小時必須使用常量,不能用變數。
測試結果:
令我驚奇地發現:這個問題背後的數學規律,居然也是斐波那契數列!要是把題目改成或一次走1級、或一次走2級、或一次走3級,那就不能用斐波那契數列來遞推了。
把定義陣列長度時的變數N改為常量20以後,程式碼就能順利通過OJ測試了!程式碼如下:
#include <iostream> using namespace std; int main() { int n[20] = {0}; int i = 0; while(cin>>n[i]) //輸入臺階數 i++; int scheme_1 = 1, scheme_2 = 2; //給最簡單的兩種方案賦初值 int scheme[20] = {0}; int ben_xiang = 0, shang_xiang = 0, qian_xiang = 0; //不用陣列遞推,節約記憶體空間 for(int j = 0; j < i; j++) { qian_xiang = scheme_1; shang_xiang = scheme_2; if(n[j] >= 3) { for(int k = 3; k <= n[j]; k++) { ben_xiang = shang_xiang + qian_xiang; qian_xiang = shang_xiang; shang_xiang = ben_xiang; //遞推公式,這個規律在草稿紙上推得 } scheme[j] = ben_xiang; } if(n[j] == 1) scheme[j] = scheme_1; if(n[j] == 2) scheme[j] = scheme_2; //尤其要注意迴圈變數和陣列下標 } for(int j = 0; j < i; j++) cout << scheme[j] << endl; return 0; }