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

  • 相关阅读:
    [转]PHP学习入门的一些基础知识
    原来我一直徘徊在选择中
    do while循环学习
    C#装箱
    我的新手学习失败之谈
    C#教程第五课:方法
    转.iPhone开发网站、论坛、博客
    数据库作业Email发送
    安装卸载WINDOWS服务
    SQL SERVER 2008 数据库收缩语句
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10551798.html
Copyright © 2011-2022 走看看