小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!
站在臺階前,他突然又想着一個問題:
如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級臺階,有多少種不同的上法呢?
請你利用計算機的優勢,幫助小明尋找答案。
要求提交的是一個整數。
注意:不要提交解答過程,或其它的輔助說明文字。
這道題目具有兩隻算法,非遞歸算法和遞歸算法。
非遞歸算法:
#include <iostream>
using namespace std;
long step[40][2];
//step[i][0]表示走到第i個臺階式最後一步邁的是左腳
//step[i][1]表示走到第i個臺階式最後一步邁的是右腳
int main()
{
step[0][0] = 0;
step[1][1] = 0;
step[0][1] = 1;
step[1][0] = 1;
for(int i = 2; i <= 39; i++)
{
step[i][0] = step[i - 1][1] + step[i - 2][1];
step[i][1] = step[i - 1][0] + step[i - 2][0];
}
cout << step[39][1];//最有一步邁的是右腳
return 0;
}
遞歸算法:
#include <iostream>
using namespace std;
long ans = 0;
void dfs(int sum,int step)
{
if(sum<0) return ;
if(step%2 == 0 && sum == 0) //如果走完臺階而且步數爲偶數則算爲一種走法
{
ans++;
return ;
}
for(int i = 1;i<=2;i++) //下一步可有走一步或者兩步
dfs(sum-i,step+1);
}
int main()
{
dfs(39,0);
cout << ans ;
return 0;
}