一尘不染

模拟嵌套循环

algorithm

在初学者的编程书籍(免费许可证)中,有以下代码,用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循环”,而没有任何对方法名称的调用?

对于你们中的某些人来说,这可能是一个非常简单的问题;我只是一个初学者。预先感谢您的帮助。


阅读 166

收藏
2020-07-28

共1个答案

一尘不染

因为这是对嵌套循环的递归调用。首先,用0调用它。然后用1调用。然后用2.调用。当达到总循环数时,它开始执行循环(这称为递归终止条件)。但是,对嵌套循环的每次调用都放在堆栈上,它执行k,然后返回并执行k-1,然后返回并执行k-2,然后返回并执行k-3一直到k-k
= 0 。

如果我是你,我会在自身内部的nestedloops()调用上放置一个断点,并观察其被调用的内容。然后,正如人们所说的那样,观察它向下运行的方式。

2020-07-28