2017-08-10 2 views
0

Dies ist das erste Mal, dass ich selbst eine Frage zu SO stellen muss. Ich finde immer Antworten, um die meisten meiner Probleme zu lösen, aber dieses Mal bin ich mit dem Permutationsalgorithmus eines Heaps beschäftigt. Ich habe versucht, diese Herausforderung für eine Weile ohne Erfolg zu lösen, also komme ich zu euch, die ein besseres Programmierwissen haben als ich.Warum gibt mein Permutationsalgorithmus für alle Permutationen dasselbe Ergebnis?

Ich schrieb etwas Javascript-Code, um jede mögliche Permutation eines Wertes rekursiv zu finden: entweder ein Array oder eine Zeichenkette. Mein Code scheint perfekt zu funktionieren, wenn ich die permutierten Werte console.log(), aber wenn ich sie in ein anderes Array verschiebe, bekomme ich den gleichen Wert für alle von ihnen. Ich bin verwirrt. Vielleicht mache ich etwas Dummes, wer weiß. Jede Hilfe würde geschätzt werden, danke in fortgeschrittenen Kerlen.

Mein Code enthält zwei separate Funktionen: die eine wechselt die Elemente und die andere rekursiv die mögliche Permutation.

arr = ["a", "b", "c"]; 
newArr = []; 

// swap mechanism here 
function swap(arr, pos1, pos2) { 
    var temp = arr[pos1]; 
    arr[pos1] = arr[pos2]; 
    arr[pos2] = temp; 
}; 

function perm(arr, nArr, n) { 
    n = n || arr.length; 
    if (n === 1) { 
     console.log(arr); // console.log() works great 
     newArr.push(arr); // pushing the permuted values does not 
    } 
    else { 
     for(var i = 1; i <= n; i += 1) { 
      perm(arr, nArr, n - 1); 
      if (n % 2) { 
       var j = 1; 
      } 
      else { 
       var j = i; 
      } 
      swap(arr, j - 1, n - 1); 
     } 
    } 
}; 
+0

Willkommen bei StackOverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren MCVE-Code veröffentlicht und das Problem genau beschrieben haben. Wir sollten in der Lage sein, Ihren gesendeten Code in eine Textdatei einzufügen und das beschriebene Problem zu reproduzieren. – Prune

Antwort

2

Dies ist einfach (Heap) Referenz vs. (Stapel) Wert Frage. Der Grund ist ziemlich einfach: arr in allen rekursiven Aufrufen verweist auf das gleiche Array im Speicher. Wenn Sie also newArr.push(arr) aufrufen, wird ein weiterer Verweis auf das gleiche Objekt zur Ergebnisliste hinzugefügt. Und wenn Sie swap tun, tauschen Sie Elemente für alle Elemente von newArr, da sie auf das gleiche Array zeigen. Siehe auch Copying array by value in JavaScript für eine mögliche Problemumgehung. (Verwenden Sie grundsätzlich die Methode Array.slice, um eine unabhängige Kopie zu erstellen).

+0

Vielen Dank, Bruder. Ich war so verwirrt, aber ich glaube, ich verstehe, was das Problem war. Eine kurze Frage: Wie kommt es, dass console.log() alle permutierten Werte anzeigt? Ich verstehe diesen Teil nicht ganz. –

+0

@WadsonFourrien, 'console.log' zeigt den aktuellen Wert zum Zeitpunkt der Ausführung. In diesem Moment befindet sich das (einzige) Array in dem gewünschten Zustand (und alle Referenzen von 'newArr' zeigen auf dasselbe Array in diesem Zustand). Aber wenn Sie das nächste Mal 'swap' aufrufen, ändern Sie das (gleiche) Array, und sein Status unterscheidet sich jetzt von dem, den Sie zuletzt geloggt haben. Es kann hilfreich sein, einen Haltepunkt zu setzen und bei der 3. oder 4. Iteration den 'newArr' zu betrachten, um zu sehen, wie er mehrere Referenzen auf denselben Speicher enthält. – SergGr

+0

Schließlich, löse dies. Danke nochmal für deine Hilfe :) –

Verwandte Themen