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