Имитация вложенных циклов - PullRequest
0 голосов
/ 21 августа 2009

В книге программирования для начинающих (бесплатная лицензия) был следующий код, динамически создающий вложенные циклы в 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'?

Также: -> В моем отладчике (встроенном в Eclipse) после печати [1,3] указатель доходит до конца скобки '}' метода 'nestedLoops' (со значением 'currentLoop' со значением 1), а затем внезапно начинает выполняться цикл for с 'currentLoop' = 0. Откуда переменная берет свое значение '0'? Почему после перехода к конечной скобке метода он начинает выполнять цикл for без какого-либо вызова имени метода?

Это может быть очень простой вопрос для некоторых из вас; Я просто новичок. Спасибо заранее за вашу помощь.

1 Ответ

3 голосов
/ 21 августа 2009

Потому что это рекурсивный вызов вложенных циклов. сначала он вызывается с 0. затем он вызывается с 1. затем с 2. когда он достигает количества полных циклов, он начинает выполнять циклы (это называется рекурсивным терминальным условием). однако каждый вызов вложенных циклов помещается в стек, он выполняет k, затем возвращает и выполняет k-1, затем возвращает и выполняет k-2, затем возвращает и выполняет k-3 вплоть до k - k = 0 .

на вашем месте я бы установил точку останова на вызове nestedloops () внутри себя и наблюдал, как он вызывается. затем, как это называется, наблюдайте, как он возвращается вниз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...