[英]JavaScript - How to create variable nested loops with recursion?
我正在尝试使用递归编写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]
[9, 9, 9]
的数组。
要正确使用递归,您需要从思考“如何”实现结果到思考“是什么”。 例如,大小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));
您可以随时作弊:使用整数并在每次迭代中将其拆分并压入数组。 这比担心需要更新哪个数组索引要容易得多。 加:额外的迭代功能。
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], []);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.