2013蓝桥杯 【初赛试题】 第39级台阶

题目描述:

    小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

    站在台阶前,他突然又想着一个问题:

    如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?


输出格式:

输出一个整数


程序分析:

这个程序不需要纠结在左脚和右脚的问题上,从中抽象出限制条件:一共走的步数是偶数;

我们可以通过递归来实现,对每次递归的结果进行判断,如果走过的台阶数为39则,结束递归,判断走的步数是否为偶数,为偶数则为上法计数器加一,否则为无效上法;

#include
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<


输出结果为:51167078


要说明stair可能出现小于0的情况,当最后只剩了一个台阶,但是小明想要跨两步的时候,这样是不可能的,也就是说他只能跨一步,两步是不可能出现的,因此也不可能是符合条件的走法。

这种递归的效果如下图:

2013蓝桥杯 【初赛试题】 第39级台阶_第1张图片

这个二叉树(本算法并不涉及二叉树知识,只是通过概念来理解)的每个叶子节点都是一种情况:

我们将每一个节点称为(x,y)

叶子节点分为两种情况:x为-1和x为0,x为-1的情况在现实中不可能发生,所以不予以考虑;

我们对每一种x为0的情况都进行判断,如果y的值为偶数,则计数器加1。


评价:该问题也是典型的递归型题目,它对每层递归都进行判断,如果stair<0,则说明不符合题意,则退出;递归终止的条件是stair=0,然后判断走的步数是否为偶数,如果为偶数,则计数器加1,否则退出递归。




转载于:https://www.cnblogs.com/zhezh/p/3773477.html

你可能感兴趣的:(2013蓝桥杯 【初赛试题】 第39级台阶)