小明刚刚看完电影《第 39 级台阶》。离开电影院的时候,他数了数礼堂前的台阶数,恰好是 39 级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上 1 个或 2 个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完 39 级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。
代码:
#include<bits/stdc++.h>
using namespace std;
int ans=0;
void f(int n,int step){
if(n<0)return;
if(n==0&&step%2==0)ans++;
f(n-1,step+1);
f(n-2,step+1);
}
int main(){
int n,step;
n=39;
step=0;
f(39,0);
cout<<ans;
}
解释:
f函数可以这样理解:n为但当前还要走的台阶数,step为当前步数。每一次走可以有两种选择分别为一次两个台阶;一次一个台阶。
通过这两个可以递归出所有的可能:
f(n-1,step+1);
f(n-2,step+1);
递归出口条件为溢出或者恰好为偶数步然后统计。
我们可以试想下如果最后只有一个台阶(n=1)的并且不为偶数步的情况:
执行f(n-1,step+1)。此时n=0但是不统计,继续往下走两个函数f发现n<0,所以返回到n=1;
f(n-2,step+1))【n=1,n-2<0】。所以返回,返回到n=2