2017-08-10 11 views
0

これは私がSOに質問をしなければならない初めてのことです。私はいつも私の問題のほとんどを解決する答えを見つけるが、今回私はヒープの順列アルゴリズムに悩まされている。私はこのチャレンジをしばらく解決しようとしてきましたので、私よりもプログラミングの知識が優れている人がいます。私の順列アルゴリズムは、すべての順列について私に同じ結果を与えるのはなぜですか?

私は値のあらゆる可能な順列を再帰的に見つけるために、いくつかのJavaScriptコードを書いた:配列か文字列。私のコードは、console.log()で置換された値を使うと完璧に動作しているようですが、別の配列にプッシュすると同じ値が得られます。よくわかりません。たぶん、私は何かばかげている、誰が知っている。どのような助けもありがとう、高度な人のおかげで。

私のコードには2つの機能があります:1つは要素の入れ替えを行い、もう1つは再帰的に可能な順列を探します。

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

ようこそStackOverflow。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 – Prune

答えて

2

これは単純な(ヒープ)参照対(スタック)値の質問です。理由は非常に単純です。すべての再帰呼び出しでarrがメモリ内の同じ配列を参照しています。したがって、newArr.push(arr)と呼び出すと、同じオブジェクトへの別の参照が結果リストに追加されます。 swapを実行すると、同じ配列を指しているので、newArrのすべての要素の要素を入れ替えます。考えられる回避策については、Copying array by value in JavaScriptも参照してください。 (独立したコピーを作成するには、基本的にArray.sliceメソッドを使用します)。

+0

ありがとう、兄さん。私はとても混乱しましたが、問題の内容を理解していると思います。簡単な質問:console.log()にすべての置換された値がどのように表示されるのでしょうか?私はその部分をかなり理解していません。 –

+0

@WadsonFourrien、 'console.log'は実行時の現在の値を表示します。その時点で、(唯一の)配列はあなたが望む状態になります(そして、 'newArr'からのすべての参照はその状態の同じ配列を指します)。しかし、次回に 'swap'を呼び出すと、同じ(同じ)配列を変更すると、その状態は前回記録したものとは異なります。ブレークポイントを設定して、3回目または4回目の繰り返しで 'newArr'を見て、同じメモリへの複数の参照がどのように含まれているかを確認すると役に立ちます。 – SergGr

+0

最後にこれを解決してください。あなたの助けをもう一度ありがとう:) –

関連する問題