我正在尝试使用嵌套的while循环和continue语句查找3个数组的所有排列。它几乎按照我的意愿工作,但是当控制权返回到外环时,它会添加一个额外的元素。我将使用递归重写它,但想知道它为什么这样做。这是一个链接:http://jsbin.com/fuyup/15/edit
感谢您的任何建议。
function findPermutations() {
var g1 = ['a1', 'a2'],
g2 = ['b1', 'b2', 'b3'];
g3 = ['c1', 'c2', 'c3', 'c4'];
var g1p = 0,
g2p = 0,
g3p = 0,
g1len = g1.length,
g2len = g2.length,
g3len = g3.length,
temp = [],
result = [];
outerloop: while (g1p < g1len) {
temp.push(g1[g1p]);
while (g2p < g2len) {
temp.push(g2[g2p]);
while (g3p < g3len) {
temp.push(g3[g3p]);
result.push(temp);
temp = [];
g3p++;
continue outerloop;
}
g3p = 0;
g2p++;
}
g2p = 0;
g1p++;
}
return result;
}
答案 0 :(得分:0)
使用continue
和备用temp = []
重置你的控制流程真的搞砸了。
在g3p = 0;
执行之前和最里面的循环(推送结果并重置temp
)之后,流程跳回temp.push(g2[g2p]);
,在同一个{{1}上调用两次数组。我在这里不详细说明......如果您需要知道,请使用调试器并逐步执行。
我已经制作了一个使用temp
的工作版本,但我并不是很幸运:
continue
你可以在这里看到对称结构,在每个层面都会发生同样的事情。每当我们输入outerloop: while (g1p < g1len) {
temp.push(g1[g1p]);
while (g2p < g2len) {
temp.push(g2[g2p]);
while (g3p < g3len) {
temp.push(g3[g3p]);
result.push(temp);
temp = [];
g3p++;
continue outerloop;
}
g3p = 0;
temp = [];
g2p++;
continue outerloop;
}
g2p = 0;
temp = [];
g1p++;
// continue outerloop; (implicit)
}
来获取序列
outerloop
已执行,我们之前重置了temp.push(g1[g1p]); temp.push(g2[g2p]); temp.push(g3[g3p]); result.push(temp);
。
创建排列的通常想法是不使用temp
,而是嵌套改变数组的正常continue
循环,并获取每个状态的快照以附加到结果:
for