在初学者的编程书籍(免费许可证)中,有以下代码,用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()调用上放置一个断点,并观察其被调用的内容。然后,正如人们所说的那样,观察它向下运行的方式。