Javascript嵌套while循环,其中continue语句的行为不符合预期

时间:2014-10-07 12:35:03

标签: javascript while-loop continue

我正在尝试使用嵌套的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;
}

1 个答案:

答案 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