2016-09-22 20 views
-1

JavaScriptでヒープの非再帰アルゴリズムを実装しました。 console.log(arr)で順列をチェックすると、すべて正常に動作します。 しかし、各順列を結果配列にプッシュしようとすると、すべてが壊れてしまいます。最後の反復置換で満たされた結果を返します。 Javascriptヒープのアルゴリズム(非再帰的)

function generate(n, arr) { 
 
\t function swap(item1, item2){ 
 
\t \t console.log(item1, item2); 
 
\t \t let tmp = arr[item1]; 
 
\t \t arr[item1] = arr[item2]; 
 
\t \t arr[item2] = tmp; 
 
\t } 
 
\t var c = []; 
 
\t var allPermutations = []; 
 
\t 
 
\t for (let i = 0; i < n; i++) { 
 
\t \t c[i] = 0; 
 
\t } 
 
\t 
 
\t console.log(arr); 
 
\t allPermutations.push(arr); 
 
\t 
 
\t for (let i = 1; i < n; i) { 
 
\t \t if (c[i] < i) { 
 
\t \t \t if (i % 2 == 0) { 
 
\t \t \t \t swap(0, i); 
 
\t \t \t } else { 
 
\t \t \t \t swap(c[i], i); 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t console.log(arr); 
 
\t \t \t allPermutations.push(arr); 
 
\t \t \t 
 
\t \t \t c[i] += 1; 
 
\t \t \t i = 1; 
 
\t \t } else { 
 
\t \t \t c[i] = 0; 
 
\t \t \t i += 1; 
 
\t \t } 
 
\t } 
 
\t 
 
\t return allPermutations; 
 
} 
 

 
console.log('result', generate(3, ["a", "a", "b"]));

+2

[ask]を読んで投稿を修正する必要があります。 – Amit

+0

あなたはコードをカットして貼り付けることはできません。 –

+0

@EdHealはreplよりも静的な出力です... –

答えて

1

問題は、配列を使用して、配列にプッシュするときに、あなたはそれへの参照を推進しているだけで参照していることです。したがって、次の反復で配列を更新し、最終出力を見ると、同じ配列であるため、すべてのインデックスが同じになります。

あなたは何をすることができますか?それを複製する。

allPermutations.push(arr.slice(0)); 
+0

はい!私はそれを完全に忘れてしまった!ありがとうございました! –

関連する問題