2015-09-12 2 views
0

Я искал способ, чтобы получить все возможные комбинации с приемом массива, так что если мы имели [1,2,3] он вернется быКомбинация с повторением

[1,1,1],[1,1,2],[1,1,3],[1,2,2],[1,2,3],[1,3,3],[2,2,2],[2,2,3],[2,3,3],[3,3,3]. 

Я посмотрел на несколько других должностей, таких, как этот здесь: https://stackoverflow.com/a/9960925/1328107 , но все они, кажется, остановятся всех комбинаций, т.е.

[ 1, 2, 3 ], [ 1, 3, 2 ],[ 2, 1, 3 ], [ 2, 3, 1 ], [ 3, 1, 2 ], [ 3, 2, 1 ]. 

Любая помощь будет принята с благодарностью.

+1

Почему-то вроде '[1,2,1]' ни один из вариантов? – Xufox

+0

http://stackoverflow.com/questions/15668880/recurse-through-single-array-logging-all-possible-combinations-in-javascript –

+0

@Xufox Я думаю, я пропустил несколько, когда печатал его. – Jarritos

ответ

2

возвратами будет делать трюк:

function combRep(arr, l) { 
    if(l === void 0) l = arr.length; // Length of the combinations 
    var data = Array(l),    // Used to store state 
     results = [];    // Array of results 
    (function f(pos, start) {  // Recursive function 
    if(pos === l) {    // End reached 
     results.push(data.slice()); // Add a copy of data to results 
     return; 
    } 
    for(var i=start; i<arr.length; ++i) { 
     data[pos] = arr[i];   // Update data 
     f(pos+1, i);     // Call f recursively 
    } 
    })(0, 0);      // Start at index 0 
    return results;     // Return results 
} 

Некоторые примеры:

combRep([1,2,3], 1); /* [ 
    [1], [2], [3] 
] */ 
combRep([1,2,3], 2); /* [ 
    [1,1], [1,2], [1,3], 
     [2,2], [2,3], 
       [3,3] 
] */ 
combRep([1,2,3], 3); /* [ 
    [1,1,1], [1,1,2], [1,1,3], 
      [1,2,2], [1,2,3], 
        [1,3,3], 

      [2,2,2], [2,2,3], 
        [2,3,3], 

        [3,3,3], 
] */ 
combRep([1,2,3]); /* Same as above */ 
+0

Спасибо этой работе отлично – Jarritos

+0

@Jarritos Первоначально это произведенные варианты вместо комбинаций с повторением, см. Фиксированную версию. – Oriol

Смежные вопросы