2009-08-21 1 views
0

in einem Programmierbuch Anfänger (kostenlose Lizenz) gibt es den folgenden Code, dynamisch verschachtelte Schleifen in Java erstellen:Simulieren verschachtelte Schleifen

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(); 
    } 
} 

i

Wenn die Eingabe N = 2 und K = 3, auf dem Bildschirm sollte etwas gedruckt werden wie [1,1], [1,2], [1,3], [2,1], [2,2], [2,3], [3,1], [3,2], [3,3] (mit Zeilenumbrüchen usw.). Das Programm funktioniert gut. Dann habe ich versucht, es zu debuggen und verbrachte eine ganze Weile damit, zu verstehen, wie genau es funktioniert. Ich konnte nicht. Meine Frage:

----> warum nach dem Drucken [1,3] die Variable 'curentLoop' wird '0' vorher '1'?

Auch: -> In meinem Debugger (Eclipse Built-in) nach dem Drucken [1,3] geht der Zeiger zum Ende '}' geschweifte Klammer der Methode 'nestedLoops' (mit 'currentLoop' mit Wert 1) und dann beginnt es plötzlich die for-Schleife mit 'currentLoop' = 0. Woher nimmt die Variable ihren Wert '0'? Warum, nach dem Ende der geschweiften Klammer der Methode, beginnt es die 'for-Schleife' ohne Aufruf des Namens der Methode auszuführen?

Dies könnte eine sehr einfache Frage für einige von Ihnen sein; Ich bin nur ein Anfänger. Vielen Dank im Voraus für Ihre Hilfe.

+1

Als eine Randnotiz ist dies ein ziemlich schrecklicher Code. So etwas wird man in der Produktionswelt nie sehen. Es ist scheußlich. –

+0

Dennoch finde ich es sehr lehrreich zu sehen, wie es funktioniert. – Imagist

+0

@imagist ja, ich werde damit gehen. Es ist gut, sich Gedanken zu machen, wenn sie in dieses Zeug hineingehen. Es ist eher so, dass einige Entwickler nie lernen, diese Art von Programmierung zu vermeiden, mit dem "wenn es kompiliert und läuft, ist es in Ordnung !!" Einstellung, nie zu berücksichtigen, wie komplex der Code zu Debugging und Wartung im Laufe der Zeit ist. –

Antwort

3

Weil es ein rekursiver Aufruf von geschachtelten Schleifen ist. Zuerst wird es mit 0 aufgerufen. Dann wird es mit 1 aufgerufen. Dann mit 2. Wenn es die Anzahl der gesamten Schleifen erreicht, beginnt es mit der Ausführung der Schleifen (dies wird die rekursive Endbedingung genannt). jedoch wird jeder Aufruf von verschachtelten Schleifen auf den Stapel gelegt, er führt k aus, gibt dann k zurück und führt k-1 aus, kehrt dann zurück und führt k-2 aus, kehrt dann zurück und führt k-3 bis hinunter zu k - k = 0 aus .

Wenn ich Sie wäre, würde ich einen Haltepunkt auf den Aufruf von Nestedloops() in sich selbst setzen und beobachten, wie es mit aufgerufen wird. dann, wie es heißt, beobachte es, wie es wieder nach unten arbeitet.

+0

Sie meinen also die Zeile 'nestedLoops (currentLoop + 1);' erstellt einen Stapel von 3 Methoden 'nestedLoops (int currentLoop)', von denen jede eine 'for' Schleife enthält, habe ich es richtig verstanden? – aeter

+0

+1 für den "abscheulichen" Kommentar. Es dauerte sogar eine Sekunde, um zu sehen, was hier vor sich ging. – GRB

+0

@aeter mehr oder weniger. Nestedloops wird wie folgt mit Null aufgerufen: nestedloops (0). dann ruft es sich immer wieder auf und inkrementiert das übergebene Argument, bis die maximale k (Anzahl der Schleifen) erreicht ist. Bitte schauen Sie es sich in Ihrem Debugger an, um sich ein Bild davon zu machen, was vor sich geht. –

Verwandte Themen