假设我有这个模式:
for(let i =0; i < 3; i++){
for(let j =0; j < 3; j++){
for(let k =0; k < 3; k++){
console.log(i,j,k)
}
}
}
好处是我可以访问最内层循环中的所有迭代变量。 i
、j
和 k
,缺点是它被硬编码为 3 层嵌套循环。如果我想要第四个,我需要手动添加该代码。
我试图使用递归来概括代码,我可以将嵌套循环的数量设置为任意变量。这是我正在尝试的:
const maxNestedLoops = 3;
const iterations = 3;
const indexes = [];
function looper(loopNumber){
for(indexes[loopNumber] = 0; indexes[loopNumber] < iterations; indexes[loopNumber]++){
if(loopNumber < maxNestedLoops){
looper(loopNumber + 1);
}
console.log(indexes);
}
}
looper(0);
第一个结果在控制台中如下:
0, 0, 0
0, 0, 1
0, 0, 2
0, 1, 0
0, 1, 1
0, 1, 2
0, 2, 0
0, 2, 1
0, 2, 2
...and so on
但是,与我的递归函数示例不同:
[0, 0, 0, 0]
[0, 0, 0, 1]
[0, 0, 0, 2]
[0, 0, 0, 3]
[0, 0, 1, 0]
[0, 0, 1, 1]
[0, 0, 1, 2]
[0, 0, 1, 3]
[0, 0, 2, 0]
[0, 0, 2, 1]
[0, 0, 2, 2]
[0, 0, 2, 3]
[0, 0, 3, 3]
...and so on
问题在于不仅有四个索引而不是三个。但有些值是 3
,我希望它最多只能达到 2
。
感谢您的建议。
最佳答案
问题在于:
您的
console.log
只能在最深级别执行。因此,请将console.log
放入else
子句中。基本情况发生在
loopNumber === maxNestedLoops - 1
时,因为这是数组的最后一个索引,因此if
条件应与此相对应
if (loopNumber < maxNestedLoops - 1){
looper(loopNumber + 1);
} else {
console.log(indexes);
}
关于javascript - 在javascript中创建N个嵌套循环的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73185950/