我不确定一旦函数被调用得更深,我如何才能访问“上层”......即我不确定如何访问 (1,2,4) 而不仅仅是 (?,?,4)
您将需要传递它们,例如在一个数组中。
for(var i = 0; i < values.length; i++)
这不应该是要执行的外部迭代,除非您想在一个简单的嵌套循环中构造一个二维结果数组(见下文)。相反,您希望value.length
成为递归的深度。在每个递归级别上,您将从 1 迭代到values[level]
那时。而不是传递 a level
,我们将传递一个当前状态的数组(上面的问号),其长度是级别。
var values = [2,3,4];
function recurse(state) {
var level = state.length;
var depth = values.length;
if (level == depth) {
console.log.apply(console, state); // or whatever you want to do
} else {
for (var i=1; i<=values[level]; i++) {
state.push(i); // save current question mark
// notice state.length = level + 1 now
recurse(state); // enter next level
state.pop(); // delete it after we're so state doesn't grow infinitely :-)
}
}
}
recurse([]);
如果要对值使用迭代,可以通过向结果数组添加越来越多的状态(每级增长一个值)来实现,最终将包含所有可能的组合:
var values = [2,3,4];
var result = [[]]; // one empty state at level 0
for (var i=0; i<values.length; i++) {
var reslen = result.length,
val = values[i];
var mult = []; // will become the new result with a length of (reslen * val)
for (var j=0; j<reslen; j++) {
for (var k=1; k<=val; k++) {
var state = result[j].slice(); // make a copy
state.push(k);
mult.push(state);
}
}
result = mult;
}
// logging the `result` on each level will show us
// 0 - [[]]
// 1 - [[1],[2]]
// 2 - [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]
// 3 - [[1,1,1],[1,1,2],[1,1,3],[1,1,4],[1,2,1],[1,2,2],[1,2,3],[1,2,4],[1,3,1],[1,3,2],[1,3,3],[1,3,4],[2,1,1],[2,1,2],[2,1,3],[2,1,4],[2,2,1],[2,2,2],[2,2,3],[2,2,4],[2,3,1],[2,3,2],[2,3,3],[2,3,4]]
您可以看到这与@Jason 的方法有何相似之处。