题目标题: 第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)即可

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

        #include<iostream>

        using namespace std;

        int f[40];  //使用递归会导致栈溢出,所以使用数组保存结果,用循环代替递归

        int main()
        {
              //先手算出前4项
        f[2] = 1;
        f[3] = 2;
        f[4] = 2;
        f[5] = 4;
        for (int i = 6; i < 40; ++i)
              f[i] = f[i - 2] + 2 * f[i - 3] + f[i - 4];

        cout << f[39] << endl;

        return 0;
        }
        最终结果:51167078