递归for循环

时间:2019-03-17 12:34:08

标签: javascript arrays

我有一个获得以下输出的方案。

0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

当输入为3时,将给出8个以上的组合。如果输入为4,将有16种组合。我可以使用嵌套的for循环实现此目标,如下所示。

value1 = 2, value2 = 2, value3 = 2;
my function () {
    for(var i = 0; i<this.value1; i++) { 
      for(var j = 0; j < this.value2; j++) { 
        for(var k = 0; k < this.value3; k++) { 
           console.log(i,j,k);
        }
      }
    }
}

如果用于输入3,这很好,但是我必须获得输入10的输出。因此,我需要如上所述编写10个嵌套的for循环。我知道这是一种不好的做法,在这里我不知道如何使用递归。请帮我。

5 个答案:

答案 0 :(得分:2)

这是一个可以完成所需工作的递归函数。

function solveUtil(limits, index, cur) {
    if (index === limits.length) {
        console.log(cur.join(' '));
    } else {

        for (let i = 0; i < limits[index]; i++) {
            cur.push(i);
            solveUtil(limits, index + 1, cur);
            cur.pop();
        }
    }
}

function solve(limits) {
    solveUtil(limits, 0, []);
}

solve(new Array(10).fill(2));

答案 1 :(得分:2)

递归方法如下所示:

function recursive(n, range, prefix) {
  prefix = prefix || "";
  if (n == 0)
    console.log(prefix);
  else
    for (let i = 0; i < range; i++)
      recursive(n - 1, range, prefix + " " + i);
}

recursive(10, 2);

答案 2 :(得分:2)

您可以利用您正在寻找二进制组合的事实,并且只需从二进制数的0开始计数并添加填充即可。

这使用了function generators,但是很容易将其转换为简单的函数。

function * findCombinations(n){
  for(let i = 0; i < Math.pow(2, n); i++){
    const c = i.toString(2);
    const padding = new Array(n - c.length + 1).join('0');
    yield padding + c;
  }
  return null;
}

const iterator = findCombinations(4);
console.log(
  Array.from(iterator)
)

答案 3 :(得分:0)

在较新的浏览器(支持.padStart)中,以下命令会产生所需的输出(但绕过而不是解决了递归问题):

let n = 4; //or any other value
    
Array(Math.pow(2,n)).fill(0).forEach((_,i) => console.log(i.toString(2).padStart(n,'0').split('').join(' ')));

答案 4 :(得分:0)

您可以将Generatorfunction*结合使用,并即时进行组合。

function* binary(length, array = []) {
    if (--length) {
        yield* binary(length, [...array, 0]);
        yield* binary(length, [...array, 1]);
    } else {
        yield [...array, 0];
        yield [...array, 1];
    }
}

[...binary(3)].map(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }