这是一个非常经典的问题,我听说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


*输出顺序无关紧要

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

最佳答案

好吧,如果您还剩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);

关于java - 通往楼梯顶部的可能路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33250876/

10-10 11:29