2014-10-07 57 views
0

我試圖找到所有使用嵌套while循環和continue語句的3個數組的排列。它幾乎是按照我的意願工作的,但是當把控制權交還給外環時會增加一個額外的元素。我將使用遞歸重寫它,但想知道它爲什麼這樣做。這裏有一個鏈接:http://jsbin.com/fuyup/15/editJavascript嵌套while循環與continue語句沒有按預期行爲

感謝您的任何建議。

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

您的代碼無效語法:'outerloop:while(g1p hindmost 2014-10-07 12:38:52

+2

@最後的'outerloop:'是一個標籤。請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label – forgivenson 2014-10-07 12:41:15

回答

0

隨着該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++; 
} 
+0

非常感謝,非常感謝。 – 2014-10-07 14:02:59