模拟嵌套循环

时间:2009-08-21 18:48:18

标签: java algorithm recursion

在初学者的编程书(免费许可证)中,有以下代码,在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](换行等)。该程序工作正常。  然后我尝试调试它并花了很长时间试图理解它是如何工作的。我不能。我的问题:

----&GT;为什么在打印[1,3]之后变量'curentLoop'变为'0'之前是'1'?

此外: - &GT;在打印[1,3]后我的调试器(Eclipse内置)中,指针转到方法'nestedLoops'的末尾'}'大括号(带有'currentLoop',值为1),然后它突然开始执行for -loop with'currentLoop'= 0.变量从哪里取值'0'?为什么在转到方法的结束后,它开始执行'for循环',而不调用方法的名字?

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

2 个答案:

答案 0 :(得分:3)

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

如果我是你,我会在内部调用nestedloops()时放置一个断点,并观察它被调用的内容。然后,就像它被称之为一样,观察它的工作方式。

答案 1 :(得分:0)

例如,可以使用this库来解决。

在您的情况下,您可以实现循环:

new Loops()
    .from(1).to(4)
    .from(1).to(4)
    .action(System.out::println);

结果:

[1, 1]
[1, 2]
[1, 3]
[2, 1]
[2, 2]
[2, 3]
[3, 1]
[3, 2]
[3, 3]