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;
}
如果有不会理解的地方,可以私信博主哦!!!