簡體   English   中英

Javascript嵌套的while循環中帶有continue語句的行為不符合預期

[英]Javascript nested while loop with continue statement not behaving as expected

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

continue然后將備用temp = []重置,您的控制流程確實搞砸了。

之前g3p = 0; 執行並執行最里面的循環(推入結果並重置temp ),流程跳回到temp.push(g2[g2p]); 在同一個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使數組變異的循環,並拍攝每個狀態的快照以追加到結果中:

temp = [];
g1p = 0;
while (g1p < g1len) {
    temp[0] = g1[g1p];

    g2p = 0;
    while (g2p < g2len) {
        temp[1]= g2[g2p];

        g3p = 0;
        while (g3p < g3len) {
            temp[2] = g3[g3p];

            result.push(temp.slice());

            g3p++;
        }
        g2p++;
    }
    g1p++;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM