2017-06-17 4 views
0

J'essaie d'écrire une fonction en JavaScript pour générer un tableau de permutations d'un tableau donné en portant le code dans la documentation Python pour itertools.permutations. (Je suis conscient que la fonction réelle est écrite en C) C'est ce que j'ai, et il sort un tableau avec la longueur correcte - n!/(Nr) !, n étant la longueur du tableau - mais chaque élément est juste le tableau original, pas réarrangé. J'apprécie une nouvelle paire d'yeux sur mon code, je suis déconcerté:Fonction permutations JavaScript - pourquoi cela ne fonctionne-t-il pas?

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

L'équivalent le plus proche serait probablement un générateur 'function *' et utilisant le mot-clé 'yield' similaire à python. –

Répondre

0

Le code python a (près du fond):

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

Vous avez traduit cela à:

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

Mais il devrait être:

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

Sans cela, indices n'est jamais utilisé, ce qui devrait être un indice.