蓝桥杯 第39级台阶(递归)


题目标题: 第39级台阶

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

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

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


请你利用计算机的优势,帮助小明寻找答案。

要求提交的是一个整数。
注意:不要提交解答过程,或其它的辅助说明文字。

思路: 这题很明显是一道递归的题目。 f(n)为n阶台阶的总走法数,则f(n) = 以下四种情况走法数的总和

(1)第一次左脚走一级,最后一次右脚走一级,中间剩余n-2阶台阶的走法有f(n-2)种

(2)第一次左脚走一级,最后一次右脚走两级,中间剩余n-3阶台阶的走法有f(n-3)种.

(3)第一次左脚走两级,最后一次右脚走一级,中间剩余n-3阶台阶的走法有f(n-3)种

(4)第一次左脚走两级,最后一次右脚走两级,中间剩余n-4阶台阶的走法有f(n-4)种

即有: f(n) = f(n-2) + 2*f(n-3) + f(n-4), 求f(39)即可

但是这样写成递归的话栈会溢出,所以可以将其改成循环的形式,如下所示代码:

 1 #include<iostream>
 2 
 3 using namespace std;
 4 
 5 int f[40];  //使用递归会导致栈溢出,所以使用数组保存结果,用循环代替递归
 6 
 7 int main()
 8 {
 9     //先手算出前4项
10     f[2] = 1;
11     f[3] = 2;
12     f[4] = 2;
13     f[5] = 4;
14     for (int i = 6; i < 40; ++i)
15         f[i] = f[i - 2] + 2 * f[i - 3] + f[i - 4];
16 
17     cout << f[39] << endl;
18 
19     return 0;
20 }

最终结果:51167078

原文地址:https://www.cnblogs.com/FengZeng666/p/10551798.html