39级台阶——递归算法求解

39级台阶——递归算法求解

作为2013年的蓝桥杯压轴题目,是极具递归思想的典型,也是被后来许多人拿来练习的一道题目,接下来就让我带大家来看看这道题的巧妙之地吧!

小明刚刚看完电影《第39级台阶》,开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!站在台阶前,他突然又想着一个问题:

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

我们不妨先思考一下

  • 如果只有一步台阶或者两步台阶的情况:

1.如果是一步台阶,那么要求偶数步走完,可以走的次数为0;要求奇数步走完,可以走的次数为1;
2.如果是两步台阶,那么要求偶数步走完,可以走的次数为1;要求奇数步走完,可以走的次数为1;

这样我们就得到了台阶数为1和2时候的次数

我们继续往下思考:
如果台阶数为三的时候,我们该怎么计算呢?
这时候可能大家就会继续想,台阶数为三,小明每次只能走1步或者2步:
如果是偶数步走完,那小明可以选择
先走一步,再走两步或者选择先走两步,再走一步;
如果是奇数步走完,那小明只能是
一步一步走完;
但是我们反过来想,如果有三步台阶,而小明每次只能走一步或者两步,那么小明的上一步一定是在第一部台阶处或者第二部台阶处

如果是偶数步走完第三部台阶,那么小明的上一步一定是奇数步走完,也就是说小明在走到第一步台阶或者第二部台阶的时候,他走了奇数步。

	int step=3;
	//偶数步走完,那么第三步是偶数步
	//even()函数为当前步数是偶数的情况
	//odd()函数为当前步数是奇数的情况
	int even(int step){
		if(step == 1){
			return 0;
		}
		else if(step == 2){
			return 1;
		}
		//寻找第三步的上一步,第二步,是奇数步
		//可能是通过走一步或者走两部到达第三部台阶
		//所以这里分为两种情况分别递归计算
		else return odd(step-1)+odd(step-2);
	}

如果是奇数步走完第三部台阶,那么小明的上一步一定是偶数步走完,也就是说小明在走到第一步台阶或者第二部台阶的时候,他走了偶数步。

	int step = 3;
	//奇数步走完,那么第三步是奇数步
	//even()函数为当前步数是偶数的情况
	//odd()函数为当前步数是奇数的情况
	int odd(int step){
		if(step == 1){
			return 1;
		}
		else if(step == 2){
			return 1;
		}
		//寻找第三步的上一步,第二步,是偶数步
		//可能是通过走一步或者走两部到达第三部台阶
		//所以这里分为两种情况分别递归计算
		else return even(step-1)+even(step-2);
	}

这就是最后一步为3的时候的解题情况(救命,写文字真的太难了~~~能理解代码就行)
同理我们在网上看,如果台阶数是4,5,6等等的时候,我们是不是也可以通过这样一种递归方式来看呢?

当台阶数为39的时候,它的上一步可以分解为台阶数为37和38的情况,就跟台阶数为3的时候我们可以分解为台阶数为1和2的情况。

所以,直接上完整代码!

#include <bits\stdc++.h>

int even(int step);
int odd(int step){
	if(step == 1){
		return 1;
	}
	else if(step == 2){
		return 1;
	}
	else{
		return even(step-1)+even(step-2);
	}
}

int even(int step){
	if(step == 1){
		return 0;
	}
	else if(step == 2){
		return 1;
	}
	else{
		return odd(step-1)+odd(step-2);	
	}
}

int main(int argc, char** argv) {
	int step = 39;
	printf("总共有%d种可能\n",even(step));
	return 0;
}


如果有不会理解的地方,可以私信博主哦!!!

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值