[英]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.