描述ios
已知一個樓梯有n級,小謝同窗從下往上走,一步能夠走一級,也能夠走兩級。問:他走到第n級樓梯有多少種走法?函數
輸入flex
一行一個正整數n,1≤n≤40。spa
輸出code
一行一個整數,表示走到第n級有多少種走法。blog
輸入樣例 1 ci
9
輸出樣例 1input
55
這道題一上手時,我相信大多數人都會第一時間想到用遞推來解。
可是那樣作題的效率較低,方法也相對複雜,不太適合剛入門C++的新手。
我使用的這個方法是源自曾經刷過的一個小升初的原題。
咱們從1開始。
樓梯級數 | 可採用方法數 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 5 |
5 | 8 |
從表格能夠看得出來,隨着樓梯級數的增長,可採用方法數也隨之增長。
增長的規律就十分眼熟了,能夠看得出來增長的規律遵循着斐波那契數列的規則。
得出這個結論後,這一題就很是簡單了。咱們能夠寫一個很是簡單的求斐波那契第n項的程序,就能夠作出這道題了。
代碼:
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a,b,c,k; 6 cin>>k; 7 a=1; 8 b=1; 9 for(int i=3;i<=k+1;i++) 10 { 11 c=a+b; 12 a=b; 13 b=c; 14 } 15 cout<<b; 16 return 0; 17 }
因爲題目要求用自定義函數來解答,因此咱們還要把它改爲自定義函數的形式。it
1 #include<iostream> 2 using namespace std; 3 void louti(int k) 4 { 5 int a=1,b=1,c; 6 for(int i=3;i<=k+1;i++) 7 { 8 c=a+b; 9 a=b; 10 b=c; 11 } 12 cout<<b; 13 } 14 int main() 15 { 16 int a,b,c,k; 17 cin>>k; 18 louti(k); 19 return 0; 20 }