2017-10-10 5 views
0

Ich habe den folgenden Code, seine Funktion ist wie folgt: Sie rufen die Methode auf und geben eine Zahl mit. Es wird alle Permutationen für die Nummer ausgeben, die Sie ihm gegeben haben.Returning changes variable (Java)

Zum Beispiel: Sie rufen die Methode wie:

Permutationen (3)

Es ausdrucken:

123, 132, 213, 231, 312, 321,

Hier ist der Code:

public static void main(String[] args) { 
    permutations(3); 
} 

public static void permutations(int n) { 
    boolean used[] = new boolean[n]; //all set to false by default 
    int perm[] = new int[n]; 
    permutations2(used, 0, perm); 
} 

private static void permutations2(boolean used[], int index, int perm[]) { 
    if (index == used.length) { 
     for (int i = 0; i < perm.length; i++) { 
      System.out.print(perm[i] + ""); 
     } 
     System.out.print(", "); 
     return; 
    } 

    for (int i = 0; i < used.length; i++) { 
     if (!used[i]) { 
      used[i] = true; 
      perm[index] = i + 1; 
      permutations2(used, index + 1, perm); 
      used[i] = false; 
     } 
    } 

} 

Meine Frage ist bei der Rückkehr der Aussage. Die Variable 'index' ändert sich, wenn diese Rückgabe aus irgendeinem Grund aufgerufen wird. Kann mir jemand erklären, warum das passiert? Der Code funktioniert gut Ich habe nur Probleme zu verstehen, wie.

Sorry für schlechtes Englisch.

+1

Dies ist ein rekursiver Algorithmus, daher wird der neue Wert von 'index' als Argument auf den Stapel geschoben, aber für den Aufrufer bleibt der Wert gleich. Tipp: Setzen Sie in Ihrer IDE einen Haltepunkt, bevor der rekursive Aufruf ausgeführt wird, und sehen Sie, wie die Funktion tiefer wird und dann zurückkehrt. –

+1

Es ändert sich nicht. Wenn Sie genau angeben können, was Sie denken lassen, können wir das vielleicht erklären. Denken Sie daran, dass Sie die gleiche Funktion mehrere Male aufrufen, auf sich selbst gestapelt sind und jeder eine eigene Kopie der Variablen erhält. – chrylis

+0

Der Wert von 'index' ändert sich nicht und ändert sich nicht, solange Sie ihm keinen neuen Wert zugewiesen haben! – BaSsGaz

Antwort

0

permutations2 ist eine rekursive Funktion, und Sie nennen es rekursiv auf Index + 1.

Wenn die rekursive Basisfall erreicht wird, dh Index == used.length wird Rückkehr aufgerufen und der Code geht noch einen rekursiven Aufruf zurück, als der Index kleiner war.