我已经集思广益了2个小时,我处于疯狂的边缘。这是代码:
import java.util.Scanner;
public class RecursiveNestedLoops {
public static int numberOfLoops;
public static int numberOfIterations;
public static int[] loops;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("N = ");
numberOfLoops = input.nextInt();
System.out.print("K = ");
numberOfIterations = input.nextInt();
input.close();
loops = new int[numberOfLoops];
nestedLoops(0);
}
public static void nestedLoops(int currentLoop) {
if (currentLoop == numberOfLoops) {
printLoops();
return;
}
for (int counter=1;counter<=numberOfIterations;counter++) {
loops[currentLoop] = counter;
nestedLoops(currentLoop + 1);
}
}
public static void printLoops() {
for (int i = 0; i < numberOfLoops; i++) {
System.out.printf("%d ", loops[i]);
}
System.out.println();
}
}
现在我不知道它是如何运作的,但是它应该如此运作。经过2个小时的思考后,我得出的结论是,我可能无法理解这些方法的作用:
printLoops();
return;
printLoops(); - 这称为打印方法是的。
返回; - 这不应该结束整个nested nestedLoops方法,只是结束程序?相反,它的作用是以某种方式重新启动方法,并开始执行for循环的其余部分。
答案 0 :(得分:1)
返回; - 这不应该结束整个nested nestedLoops方法,只是结束程序吗?
它会将当前通话结束到nestedLoops
。但是nestedLoops
是递归的 - 它自己调用 - 并且结束当前调用将不会终止所有调用代码。
考虑这个简单的非递归示例:
public void foo() {
System.out.println("foo");
return;
}
public void foobar() {
foo();
System.out.println("bar");
}
foobar()
会同时打印foo
和bar
,因为来自return
的来电中的foo()
不会终止对bar()
的调用
使用递归,它是相同的,除了两个调用是相同的方法。终止一个呼叫nestedLoops
不会终止另一个呼叫。
答案 1 :(得分:0)
当它currentLoop == numberOfLoops
停止时,return
。您的第一次调用currentLoop
为0.然后1.当currentLoop
为numberOfLoops
时,它会停止。我相信你的问题在循环中递归,我想你想要
public static void nestedLoops(int currentLoop) {
// System.out.printf("%d of %d%n", currentLoop, numberOfLoops);
if (currentLoop == numberOfLoops) {
printLoops();
return;
}
for (int counter = 1; counter <= numberOfIterations; counter++) {
loops[currentLoop] = counter;
}
nestedLoops(currentLoop + 1); // <-- HERE
}