【问题标题】:JavaScript - How to create variable nested loops with recursion?JavaScript - 如何使用递归创建变量嵌套循环?
【发布时间】:2016-01-14 07:32:59
【问题描述】:

我正在尝试使用递归编写 N 个嵌套循环,但是我花了很长时间才实现它。我还没有解决如何比较包含循环索引的数组的所有级别。我的目标是让索引数组遍历所有组合。

例如,如果 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]

【问题讨论】:

  • mywiki.wooledge.org/XyProblem 你想达到什么目的?另外,请使用清晰的变量名。这很难理解。
  • @MichaelDibbets 我想得到数组的所有组合,在这个例子中,数组将从 [9, 9, 9] 到 [0, 0, 0] 穿过 [9, 9 , 8], [9, 9, 7], ..., [9, 8, 9], ..., [8, 8, 9], ...等
  • 是的,好的。但是,数组中是否只有数组,并且最终您希望使用的对象是您选择的对象?还是只是为了走组合?那么是 [arr[arr[arr[object,object,object]]] 还是 [arr[arr[object,arr[arr[object]]]
  • @MichaelDibbets 我已经阅读了您第一条评论中的链接,我想我知道更多我想要什么。我再提一个问题。

标签: javascript loops recursion


【解决方案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));

【讨论】:

    【解决方案2】:

    您总是可以作弊:使用整数并在每次迭代时将其拆分并推送到数组中。比担心需要更新的数组索引要容易得多。加:奖励迭代函数。

    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

    【讨论】:

      猜你喜欢
      • 2013-08-19
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多