2017-06-17 22 views
0

私はJavaScriptで関数を記述して、与えられた配列の並べ替えの配列を生成しようとしています。これは、itertools.permutationsのPythonドキュメントにcodeを移植します。 (実際の関数はC言語で書かれていますが)これは私が持っているもので、正しい長さの配列を出力します - n!/(nr)!, nは配列の長さですが、元の配列は再配置されません。私は困惑してるように私は、私のコードの上に目の新鮮なペアをいただければと思います:JavaScriptの置換機能 - これはなぜ機能しないのですか?

function permutations(array, r) { 
    if (r === undefined) r = array.length; 
    if (r > array.length) return; 
    var indices = range(array.length); 
    var cycles = range(array.length, array.length - r, -1); 
    var result = [[]]; 
    for (var i = 0; i < r; i++) { 
     result[0].push(array[i]); 
    } 
    while (1) { 
     var exhausted = true; 
     for (var i = r - 1; i >= 0; i--) { 
      cycles[i] -= 1; 
      if (cycles[i] == 0) { 
       indices = indices.slice(0, i).concat(
        indices.slice(i + 1) 
       ).concat([indices[i]]); 
       cycles[i] = array.length - i; 
      } 
      else { 
       var j = cycles[i]; 
       swap(indices, i, indices.length - j); 
       var p = []; 
       for (var i = 0; i < r; i++) { 
        p.push(array[i]); 
       } 
       result.push(p); 
       exhausted = false; 
       break; 
      } 
     } 
     if (exhausted) break; 
    } 
    return result; 
} 
+0

最も近いものは、おそらくジェネレータ 'function *'で、pythonに似た 'yield'キーワードを使用します。 –

答えて

0

をPythonのコードは、(底部近く)があります。

yield tuple(pool[i] for i in indices[:r]) 

あなたがにそれを翻訳:

  for (var i = 0; i < r; i++) { 
       p.push(array[i]); 
      } 
      result.push(p); 

しかし、それは次のようになります。

  for (var i = 0; i < r; i++) { 
       p.push(array[indices[i]]); 
      } 
      result.push(p); 

それがなければ、indicesは決して使用されません。これは手がかりになります。

関連する問題