题目描述:
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
输出格式:
输出一个整数
程序分析:
这个程序不需要纠结在左脚和右脚的问题上,从中抽象出限制条件:一共走的步数是偶数;
我们可以通过递归来实现,对每次递归的结果进行判断,如果走过的台阶数为39则,结束递归,判断走的步数是否为偶数,为偶数则为上法计数器加一,否则为无效上法;
#include<iostream>
using namespace std;
int count=0;
void fun(int stair,int step)
{ //stari用于表示剩余的楼梯的层数,当等于0时停止递归
//step是走过的步数,用来判断是否是偶数,是否符合要求
if(stair<0)return;
if(stair==0) //39节楼梯全部走完
{
if(step%2 == 0)count++;
return;
}
fun(stair-1,step+1); //这一步走了一个台阶
fun(stair-2,step+1); //这一步走了两个台阶
}
int main()
{
fun(39,0);
cout<<count<<endl;
return 0;
}
输出结果为:51167078
要说明stair可能出现小于0的情况,当最后只剩了一个台阶,但是小明想要跨两步的时候,这样是不可能的,也就是说他只能跨一步,两步是不可能出现的,因此也不可能是符合条件的走法。
这种递归的效果如下图:
这个二叉树(本算法并不涉及二叉树知识,只是通过概念来理解)的每个叶子节点都是一种情况:
我们将每一个节点称为(x,y)
叶子节点分为两种情况:x为-1和x为0,x为-1的情况在现实中不可能发生,所以不予以考虑;
我们对每一种x为0的情况都进行判断,如果y的值为偶数,则计数器加1。
评价:该问题也是典型的递归型题目,它对每层递归都进行判断,如果stair<0,则说明不符合题意,则退出;递归终止的条件是stair=0,然后判断走的步数是否为偶数,如果为偶数,则计数器加1,否则退出递归。