Ich habe ein Projekt für die Schule zu tun, in dem ich eine rekursive Methode verwenden muss, die alle Umschaltmöglichkeiten zwischen einigen Zahlen berechnet. I.E: [1,2] => 1,2 und 2,1.ArrayList von int [] in einer rekursiven Methode
Also ich habe diese Methode verwendet und es schien richtig zu funktionieren, wenn ich nur die Lösungen auf der Konsole drucke, aber wenn ich die Registerkarten in einer ArrayList (ich muss sie später verwenden), wird es immer füge dieselbe Reihenfolge hinzu. In meinem Beispiel hätte es 1,2 und 1,2 anstelle von 1,2 und 2,1 hinzugefügt.
Hier ist mein Code:
public static void permute(int start, int[] input, ArrayList <int[]> al) {
//This method is recursive, it will open multiple instances of the input tab by calling itself and modify them, then stock tab in ArrayList when the operations are done for this tab.
//ArrayList must be empty.
//Printing tab if iterations for that specific tab are done
if (start == input.length) {
al.add(input);
////////////////////////////////
// For printing tabs in console.
// for(int x: input){
// System.out.print(x);
// }
// System.out.println("");
////////////////////////////////
//End the specific tab loop when it's printed
return;
}
for (int i = start; i < input.length; i++) {
// Changing numbers
int temp = input[i];
input[i] = input[start];
input[start] = temp;
//////////////////////////////////////////////////
// Tests to see algorithm steps
//
// System.out.print("temp : " + temp + " ... ");
// System.out.print("i : "+i + " ... ");
// System.out.print("start : " + start);
// System.out.println("");
// System.out.print("---");
// for(int x: input){
// System.out.print(x);
// }
// System.out.println("");
//////////////////////////////////////////////////
//Changing numbers
permute(start + 1, input, al);
// Changing numbers
int temp2 = input[i];
input[i] = input[start];
input[start] = temp2;
}
}
ich start = 0, Eingang = {1,2,3} und die Arraylist leer ist, bevor das Verfahren beginnt.
Hoffe, du kannst helfen, danke!
Dank Mann, es hat funktioniert! Aber kann ich Sie den Unterschied zwischen meiner Linie und der Deep-Kopie fragen? Ich meine, wann sollte ich die Deep-Copy über die Eingangsreferenz verwenden? –
Sie möchten Deep-Copy immer dann verwenden, wenn Sie eine echte neue Kopie des Objekts erhalten möchten, anstatt nur eine Kopie der aktuellen Referenz auf das Objekt. Letzteres schützt Sie nicht vor anderem Code, der das zugrundeliegende Objekt durch den Verweis, den sie halten, verändert, genau was Sie hier ausgelöst hat. Um zu verstehen, warum dies notwendig ist, google nach "ist Java Pass by Reference oder Wert?" – Edd