zoukankan      html  css  js  c++  java
  • 蓝桥杯 第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

  • 相关阅读:
    图片处理帮助类
    网站前端的优化
    状态码大全
    服务端性能监控工具Nmon使用方法
    jmeter测试报告解析
    jmeter聚合报告
    jmeter跨线程组调用参数
    jmeter生成测试报告
    Jmeter获取cookie
    monkey的使用方法和常见命令
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10551798.html
Copyright © 2011-2022 走看看