问题描述

想象有一只小青蛙,它想跳上一些台阶。但是这只青蛙有一个规则:它可以一次跳上1个台阶,或者一次跳上2个台阶。现在的问题是,如果总共有 n 个台阶,那么这只青蛙有多少种不同的方式可以跳上去呢?

示例

比如有2个台阶,小青蛙可以:

  1. 先跳1个台阶,再跳1个台阶。
  2. 直接跳2个台阶。

所以,当有2个台阶时,小青蛙有2种不同的跳法。

解决方案

我们可以通过一个简单的数学方法来解决这个问题。我们发现,如果要知道 n 个台阶有多少种跳法,其实就等于知道 n−1个台阶加上 n−2个台阶的跳法数量之和。

为什么呢?因为无论最后一步怎么跳(跳1个或跳2个),剩下的跳法就是前面 n−1 或 n−2个台阶的跳法。

代码实现

根据上面的思路,我们可以写出如下的Java函数 jumpFloor,它接受一个整数参数 number 表示台阶的数量,并返回青蛙可以跳上这些台阶的不同方式的数量。

public class FrogJump {
    public int jumpFloor(int number) {
        // 如果没有台阶,那就是0种方法
        if (number <= 0) {
            return 0;
        }
        // 如果只有1个台阶,那只能跳1步,所以是1种方法
        if (number == 1) {
            return 1;
        }
        // 如果是2个台阶,可以直接跳2步或跳两次1步,所以是2种方法
        if (number == 2) {
            return 2;
        }

        // 初始化前两个台阶的跳法数量
        int oneStepBefore = 1; // 1个台阶的跳法
        int twoStepsBefore = 2; // 2个台阶的跳法
        int result = 0;

        // 从第三个台阶开始计算
        for (int i = 3; i <= number; i++) {
            // 当前台阶的跳法等于前两个台阶的跳法之和
            result = oneStepBefore + twoStepsBefore;
            // 更新前两个台阶的跳法
            oneStepBefore = twoStepsBefore;
            twoStepsBefore = result;
        }

        // 返回结果
        return result;
    }
}

如果这篇文章对你有帮助,请点个免费的赞👍,让它能够帮助更多的人。