2014-10-07 56 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