【问题标题】:Number of combinations to the nth step taking 1, 2 or 3 steps at a time‽1、2、3步的第n步组合数‽
【发布时间】:2019-12-26 08:44:02
【问题描述】:

我正在做以下编程练习:Number of combinations to the nth step。声明是:

你需要到第n个楼梯,挑战是得到数字 您可以通过 1,2 或 3 到达第 n 级楼梯的不同方式 一步一步。

例如,有多少种方法可以到达第 3 步。你可以到达那里 4 如下所示: [1,1,1] [1,2] [2,1] [3]

编写查找所有不同组合的方法 findCombs 达到第 n 步的方法!

到现在为止,我都是手工计算的组合:

1 -> [1]

2 -> [1,1], [2]

3 -> [1,1,1], [1,2], [2,1], [3]

4 -> [1,1,1,1],[2,1,1][1,2,1],[1,1,2],[2,2],[3,1],[1,3]

5 -> [1,1,1,1,1],[2,1,1,1],[1,2,1,1],[1,1,2,1],[1,1,1,2],[2,2,1],[2,1,2],[1,2,2],[3,2],[2,3]

6 -> [1,1,1,1,1,1],[2,1,1,1,1],[1,2,1,1,1],[1,1,2,1,1],[1,1,1,2,1],[1,1,1,1,2],[2,2,1,1],[2,1,2,1],[2,1,1,2],[1,2,2,1],[1,1,2,2],[2,2,2],[3,2,1],[2,3,1],[1,2,3],[3,3]

如果正确,我们对每个步骤数都有以下组合:

1: 1; 2: 2; 3: 4; 4: 7; 5: 10; 6: 16...

到目前为止我已经写过,如果步数为0或负数,它应该输出-1;如果 step 是 1 或 2,我们分别计算 1 或 2。

public class Stairs {
    public int findCombs(int n){
      if(n <= 0) return -1;
      if(n <= 2) return n;
      return 0;
    }
}

作为测试:

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

public class mainTests {

    @Test
    public void test_n_3(){
        Stairs stairs = new Stairs();
        Assert.assertEquals(4,stairs.findCombs(3));
    }

    @Test
    public void test_n_7(){
        Stairs stairs = new Stairs();
        Assert.assertEquals(44,stairs.findCombs(7));
    }

    @Test
    public void test_n_25(){
        Stairs stairs = new Stairs();
        Assert.assertEquals(2555757,stairs.findCombs(25));
    }

    @Test
    public void test_n_0(){
        Stairs stairs = new Stairs();
        Assert.assertEquals(-1,stairs.findCombs(0));
    }
}

我们如何计算一般情况?

我已阅读:

那么,我们如何计算到第 n 步的组合数,一次走 1、2 或 3 步呢‽

编辑:在@Saurav Kumar Singh 回答之后,我写了以下内容:

public class Stairs {
    public int findCombs/*????*/(int n){
      if(n <= 0) return -1;
      if(n <= 2) return n;
      if(n == 3) return 4;
      return findCombs(n-1) + findCombs(n-2) + findCombs(n-3);
    }
}

它通过了测试。但是我想删除硬编码的基本情况:

if(n == 3) return 4;

我试过了:

public class Stairs {
    public int findCombs(int n){
      if(n <= 0) return -1;
      if(n <= 2) return n;
      return findCombs(n-1) + findCombs(n-2) + n-3 > 0 ? findCombs(n-3) : 1;
    }
}

但是,当我们想要楼梯为 3、1 为 4、2 为 5 时,它输出 -1...

我也试过了:

public class Stairs {
    public int findCombs(int n){
      if(n <= 0) return 1;
      if(n <= 2) return n;
      return findCombs(n-1) + findCombs(n-2) + findCombs(n-3);
    }
}

但是当 n 为负数或 0 时,它输出 1,而不是 -1

如何编写解决方案而不需要包含:if(n == 3) return 4;

【问题讨论】:

  • 这可以使用动态规划解决!

标签: java function math int combinations


【解决方案1】:

可以使用动态规划轻松解决。

如果你已经解决到 Nth step 那么达到 N+1th 步骤将是这其中之一 -

  • 达到 Nth 步 + 单步 步到 N+1 步的可能方法
  • 达到 N-1th 步 + 步到 N+1th 步的可能方法
  • 达到 N-2th 步 + 三重 步到 N+1 步的可能方法

因此S(N+1) = S(N) + S(N-1) + S(N-2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2010-12-02
    相关资源
    最近更新 更多