JavaScript-如何使用递归创建变量嵌套循环
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]
。
要正确使用递归,您需要从思考"如何"实现结果切换到思考"结果是什么"。例如,大小为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], []);
演示
相关文章:
- Knockout.js中带有if:子句的嵌套循环
- 有没有一种方法可以在所有嵌套循环之后放置一个标签,以便在一步中将它们全部打断
- JavaScript:在嵌套循环中为数组赋值
- Javascript嵌套循环匹配、组合、替换
- 在嵌套循环中处理 AJAX (Angularjs)
- knockout.js中的嵌套循环
- 在二维数组中搜索比嵌套循环更有效的方法
- 用于动态创建对象的嵌套循环
- 在javascript中嵌套循环
- JavaScript中的嵌入循环和嵌套循环之间有区别吗
- 嵌套循环中数组2d中的javascript变量丢失
- 嵌套循环javascript棋盘
- jQuery嵌套循环nextUntil选择器
- 如何使用嵌套循环使用 Javascript 打印到外部循环的输出中
- 如何在 Javascript 中创建一个模拟 100 行和 10 列网格的嵌套循环
- 如何避免嵌套循环
- 嵌套循环中 Javascript 变量的作用域
- JavaScript-如何使用递归创建变量嵌套循环
- 流星.js&空格键-在嵌套循环中传递变量
- 嵌套循环中未定义的变量