【问题标题】:possible paths to the top of a staircase通往楼梯顶部的可能路径
【发布时间】:2015-10-22 12:43:08
【问题描述】:

这是一个非常经典的问题,我听说 Google 在他们的采访中使用了这个问题。

问题:创建一个递归方法,打印从楼梯底部到具有 n 个楼梯的楼梯顶部的所有可能的唯一方式。您一次只能走 1 步或 2 步。

示例输出:如果是一个有 3 个楼梯的楼梯...

1 1 1

2 1

1 2

如果是4级楼梯的话……

1 1 1 1

1 1 2

1 2 1

2 1 1

2 2

*输出顺序无关紧要

我在这里看到过类似的问题,但他们都要求提供路径总数。这种递归方法需要打印出所有可能的路径。 这里唯一的限制是你必须在方法的某处使用递归。如果需要,您可以使用多种方法。

【问题讨论】:

标签: java recursion


【解决方案1】:

好吧,如果你还剩 0 个楼梯,你就到了尽头;如果你还有 1 个楼梯,下一步只能是 1 号;如果你前面有更多的楼梯,下一步可能是 1 或 2 个楼梯,所以递归变得非常简单:

void makeSteps(List<Integer> prevSteps, int s) {
    if (s == 0) {                        // no more stairs left
        System.out.println(prevSteps);
    } else {                             // 1 or more stairs left
        List<Integer> n1 = new ArrayList<>(prevSteps);
        n1.add(1);
        makeSteps(n1, s - 1);
        if (s > 1) {                     // 2 or more stairs left
            List<Integer> n2 = new ArrayList<>(prevSteps);
            n2.add(2); 
            makeSteps(n2, s - 2);
        }           
    }
}

prevSteps 代表之前的路径,s 存储剩余的楼梯数。要打印 n 步楼梯的所有可能方式,请调用:

makeSteps(new ArrayList<>(), n);

这段代码可以很容易地重构为更通用的形式,可能的步长不仅可以是 1 或 2,还可以是不超过 maxStep 的任何数字:

void makeSteps(List<Integer> prevSteps, int s, int maxStep) {
    if (s == 0) {                        // no more stairs left
        System.out.println(prevSteps);
    } else {                             // 1 or more stairs left
        for (int step = 1; step <= Math.min(maxStep, s); step++) {
            List<Integer> newSteps = new ArrayList<>(prevSteps);
            newSteps.add(step);
            makeSteps(newSteps, s - step, maxStep);
        }           
    }
}

要获得相同的结果,请使用第三个参数调用它:

makeSteps(new ArrayList<>(), 4, 2);

【讨论】:

  • 太棒了!太感谢了!我忘记了你不能使用任何形式的循环,但这是一个很好的开始。我喜欢你的想法。我会努力的。非常感谢!
猜你喜欢
  • 2011-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2017-12-24
  • 1970-01-01
相关资源
最近更新 更多