📌  相关文章
📜  计数到达第 n 个楼梯的方法的Java程序(1)

📅  最后修改于: 2023-12-03 14:57:26.013000             🧑  作者: Mango

计数到达第 n 个楼梯的方法的Java程序

简介

这是一个用Java语言编写的程序,用于计算到达第 n 个楼梯的不同方法数。

假设你站在一个楼梯前面,每一步可以向上爬 1 步或 2 步,计算到达第 n 个楼梯的所有不同方法数。

算法思路

我们可以使用动态规划的思路来解决这个问题。

假设 f(n) 表示到达第 n 个楼梯的方法数。

当 n = 1 时,只有一种方法,即 f(1) = 1。

当 n = 2 时,有两种方法,即 f(2) = 2。

当 n > 2 时,我们可以将到达第 n 个楼梯的所有方法分为两类:

  • 最后一步是跨一步:此时,到达第 n-1 个楼梯的方法数为 f(n-1),因此到达第 n 个楼梯的方法数为 f(n-1)。
  • 最后一步是跨两步:此时,到达第 n-2 个楼梯的方法数为 f(n-2),因此到达第 n 个楼梯的方法数为 f(n-2)。

因此,当 n > 2 时,我们有:

f(n) = f(n-1) + f(n-2)

最后,只需要返回 f(n) 的值即可。

代码实现

下面是使用 Java 语言实现的计数到达第 n 个楼梯的方法数的代码片段(代码片段以markdown标识):

/**
 * 计算到达第 n 个楼梯的不同方法数
 *
 * @param n 第 n 个楼梯
 * @return 到达第 n 个楼梯的不同方法数
 */
public static int countMethods(int n) {
    if (n <= 2) {
        return n;
    }

    int f1 = 1;  // f(1)
    int f2 = 2;  // f(2)
    int fn = 0;  // f(n)

    for (int i = 3; i <= n; i++) {
        fn = f1 + f2;
        f1 = f2;
        f2 = fn;
    }

    return fn;
}
测试用例

下面是使用JUnit框架编写的测试用例:

import org.junit.Assert;
import org.junit.Test;

public class StairsCountTest {
    @Test
    public void testCountMethods() {
        Assert.assertEquals(1, StairsCount.countMethods(1));
        Assert.assertEquals(2, StairsCount.countMethods(2));
        Assert.assertEquals(3, StairsCount.countMethods(3));
        Assert.assertEquals(5, StairsCount.countMethods(4));
        Assert.assertEquals(8, StairsCount.countMethods(5));
        Assert.assertEquals(13, StairsCount.countMethods(6));
        Assert.assertEquals(21, StairsCount.countMethods(7));
    }
}
总结

本文介绍了一个用Java语言编写的程序,用于计算到达第 n 个楼梯的不同方法数。该程序使用动态规划的思路,时间复杂度为 O(n),空间复杂度为 O(1)。程序通过测试用例验证正确性,使用者可放心使用。