2016-01-14 3 views
0

Я пытаюсь написать N число вложенных циклов с рекурсией, но для этого я слишком долго занимался этим. Я не решил, как сравнить все уровни массива, который содержит индекс петель. Моя цель - заставить массив индексов пройти все комбинации.JavaScript - Как создать переменные вложенные циклы с рекурсией?

Например, если N равно 3, то вложенные циклы с итераций будет выглядеть следующим образом:

var i = 10; 
while (i--) { 
    var j = 10; 
    while (j--) { 
     var k = 10; 
     while (k--) { 
      if (i === 0 && j === 0 && k === 0) { return 0; } 
     } 
    } 
} 

и комбинации между I, J, K перейти от [9, 9, 9] к [0, 0, 0].

Моя попытка это:

function nloops(n) { 
    loop(n, [], 0); 
} 

function loop(n, array, index) { 
    if(array.length != n) { 
     array[index] = 10 - 1; 
     loop(n, array, index + 1); 
    } else { 
     if ((n - index + 1) < 0) { 

     } else { 
      if (array[n - index + 1] > 0) { 
       array[n - index + 1]--; loop(n, array, index + 1); 
      } 
     } 
    } 
} 

nloops(3); 

Мой ожидаемое поведение будет массив идти от [9, 9, 9] до [0, 0, 0].

+1

http://mywiki.wooledge.org/XyProblem Что вы пытаетесь достичь? Кроме того, используйте чистые имена переменных. Это очень сложно. – Tschallacka

+0

@MichaelDibbets Я хочу получить все комбинации массива, в этом примере массив будет идти от [9, 9, 9] до [0, 0, 0], проходящих через [9, 9, 8], [9, 9, 7], ..., [9, 8, 9], ..., [8, 8, 9], ... и т. Д. – forkfork

+0

да, ладно. Но будут ли только массивы в массивах и объект по вашему выбору в конце, с которым вы хотите заняться? или это просто ходить комбо? Так [arr [arr [arr [object, object, object]]] или это [arr [arr [object, arr [arr [object]]] – Tschallacka

ответ

1

Чтобы правильно использовать рекурсию, вам нужно переключиться с мысли о том, «как» достичь результата, чтобы думать о «чем» результат. Например, что представляет собой комбинация размера n? Если n равно нулю, результатом является пустое множество, в противном случае это произведение исходного набора и всех комбинаций размера n - 1.

function combinations(elements, size) { 
 
    var result = []; 
 

 
    if (size === 0) { 
 

 
     result.push([]); 
 

 
    } else { 
 

 
     combinations(elements, size - 1).forEach(function (previousComb) { 
 
      elements.forEach(function (element) { 
 
       result.push([element].concat(previousComb)); 
 
      }); 
 
     }); 
 
    } 
 

 
    return result; 
 
} 
 

 
var combs = combinations(['a', 'b', 'c', 'd'], 3); 
 
document.write("<pre>" + JSON.stringify(combs,0,3));

0

Вы всегда можете обмануть немного: использовать целый ряд и раскол и толкать его в массив на каждой итерации. Намного легче, чем беспокоиться о том, какой индекс массива вам нужно обновить. Плюс: бонусная итеративная функция.

function pad(str) { 
    if (str.length === 3) return str; 
    return pad(0 + str); 
} 

function iter(n, init) { 
    if (Array.isArray(n)) n = n.join(''); 
    var arr = pad(n.toString()).split('').map(Number); 
    init.push(arr); 
    return n === 0 ? init : iter(--n, init); 
} 

var out = iter([9, 9, 9], []); 

DEMO

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