模拟嵌套循环
问题内容:
在初学者的编程书籍(免费许可证)中,有以下代码,用Java动态创建嵌套循环:
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();
}
}
一世
当输入N = 2和K =
3时,应该在屏幕上打印类似[1,1],[1,2],[1,3],[2,1],[2,2],[2]的内容,3],[3,1],[3,2],[3,3](带有换行符等)。该程序工作正常。然后,我尝试对其进行调试,并花了很多时间尝试了解它的工作原理。我不能
我的问题:
-—>为什么在打印[1,3]之后变量’curentLoop’变成‘0’而预先是‘1’?
另外:->在打印[1,3]之后,在我的调试器(内置Eclipse)中,指针指向方法“ nestedLoops”(带有“
currentLoop”,值为1)的末尾“}”大括号,然后突然从’currentLoop’=
0开始执行for循环。变量从何处取值‘0’?为什么在转到方法的最后括号后,它开始执行“ for循环”,而没有任何对方法名称的调用?
对于你们中的某些人来说,这可能是一个非常简单的问题;我只是一个初学者。预先感谢您的帮助。
问题答案:
因为这是对嵌套循环的递归调用。首先,用0调用它。然后用1调用。然后用2.调用。当达到总循环数时,它开始执行循环(这称为递归终止条件)。但是,对嵌套循环的每次调用都放在堆栈上,它执行k,然后返回并执行k-1,然后返回并执行k-2,然后返回并执行k-3一直到k-k
= 0 。
如果我是你,我会在自身内部的nestedloops()调用上放置一个断点,并观察其被调用的内容。然后,正如人们所说的那样,观察它向下运行的方式。