7.2走楼梯

有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶,2阶,3阶,请实现一个方法,计算小孩有多少种上楼梯的方式.
为了防止溢出,请将结果模以mod 1000000007

给定一个正整数int n,请返回一个数,代表上楼的方式数.
保证n小于等于100000.



什么是递归,看起来是从上往下处理问题,这是现象,
实际上是从小往上处理问题,这是本质.
执行完最小最小的那个不可分割的问题,然后返回一个数值用于上一层使用,这就是递归的核心思想.

递归解法思路:
最小的不可分割问题有3个
第一个,当台阶n == 0时,此时有1种走法,就是不动.
第二个,当台阶n==1时,有1种走法,即走1步.
第三个,当台阶n==2时,有2种走法,即一步一步上去,或者一下子走两步.

有了这三个基本问题后,剩下的就是类似的子问题.
当n == 3时,如果先走1步,那么就剩下两阶,从这三个基本问题中的n==2可以得出结果,如果要走上第三阶,那么就有2种走法.
如果先走2步,那么就剩下一阶,从这三个基本问题中的n==1中可以得出结果,如果要走上第三阶,有1种走法.
如果先走3步,那么就剩下零阶,从这三个基本问题中的n==0中可以得出结果,即只有1种走法.
那么n == 3时,一共有1+1+2=4种走法,依次类推.
从子问题到大问题,就是递归的思想,每次return返回的都是下面一层的值,返回到上一层来使用

图片.png
    迭代的思想:
    何为之迭代,即在知道循环的次数之后,用循环来实现递归的解法.
第一步就是先初始化基本条件.
第二步,循环,使用基本条件来不断更新下一个循环的值
package _7节;

public class _7_2爬楼梯 {
    public static void main(String[] args) {
        System.out.println(climbFloor(5));
        System.out.println(climbFloor(5));
    }

    /*
        递归
     */
    public static int climbFloor(int n) {
        if (n < 0)
            return 0;
        if (n == 0 || n == 1)
            return 1;
        if (n == 2)
            return 2;
        return climbFloor(n - 1) + climbFloor(n - 2) + climbFloor(n - 3);
    }

    /*
        迭代,即循环,知道循环的次数
     */
    public static int climbFloorDiedai(int n) {
        if (n < 0)
            return 0;
        if (n == 0 || n == 1)
            return 1;
        if (n == 2)
            return 2;
        if (n == 3)
            return 4;
        int n1 = 1;
        int n2 = 2;
        int n3 = 4;

        for (int i = 4; i <= n; i++) {
            int _n1 = n1;
            n1 = n2;
            n2 = n3;
            n3 = ((n1 + n2) % 1000000007 + _n1) % 1000000007;
        }
        return n3;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的方式。为...
    正在努力ing阅读 4,112评论 0 0
  • 题目描述有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的...
    难以置信的优雅阅读 1,605评论 0 0
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,750评论 0 2
  • 1. 有一棵二叉树,请设计一个算法,按照层次打印这棵二叉树。 给定二叉树的根结点root,请返回打印结果,结果按照...
    Crystalajj阅读 9,493评论 0 2
  • 动态规划算法一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态...
    Stephen__Li阅读 3,184评论 0 1