2012-12-30 107 views
0

我是這個網站的新手,我想你可以幫我解決一些我無法解決的問題。如何在Javascript中遞歸且高效地嵌套for循環?

我需要循環嵌套for循環,並找到一種方法來推動單個數組中的所有單一葉子在我for循環中心的完整路徑。

換句話說,我需要做的是這樣

var link2 = function(node,nb){ 
var array =[]; 
//getAnwers returns an array containing the leaves of the node. 
var array1 = getAnswers(node); 
     for(var j =0;j<getAnswers(node).length;j+=2){  
      var array2 = getAnswers(array1[j]); 
      for(var k = 0;k<array2.length;k+=2){ 
       var array3 = getAnswers(array2[k]); 
       for(var l=0;l<array3.length;l+=2){ 
        var arraytemp = []; 
        arraytemp.push(mot); 
        arraytemp.push(array1[j]); 
        arraytemp.push(array2[k]); 
        arraytemp.push(array3[l]); 
        array.push(arraytemp); 
        print(arraytemp); 
       } 
      } 
     } return array; 
    } 
}} 

但在遞歸的方式! 我嘗試通過做這樣的事情,其中​​nb是遞歸的數量。

var link6 = function(node,nb){ 
var array = []; 
var arraySave = []; 

var helper = function(node2,nb,arrayTemp){//pause(); 
    if(nb<=0){ 

     for(var k=0;k<arrayTemp.length;k+=2){ 
      var arrayChain = []; 
      for(var j=0;j<arraySave.length-1;j++){ 
       arrayChain.push(arraySave[j]); 
      } 
      arrayChain.push(arrayTemp[k]); 
      if(k===arrayTemp.length-2){ 
       arraySave.pop(); 
       arraySave.pop(); 
      } 
      array.push(arrayChaine); 
     } 
    } 

    else{ 
     var array1 = getAnswers(node2); 
     for(var i =0;i<array1.length;i+=2){ 
       arraySave.push(array1[i]); 
       helper(array1[i],nb-1,array1); 
       return array; 
      } 

    } 
} 
helper(node,nb,null); 
return array; 

}

的問題是,我該怎麼辦我在第一個代碼做同樣的事情,但在遞歸的方式,所以我可以選擇我的水平有樹的數量!我嘗試了你可以看到的功能link6,但沒有設法得到好的結果....我是一個初學者..

非常感謝!

+0

您在那裏執行的'if..else'鏈將永遠不會超過第一個'else',因爲它會繼續循環。嘗試使示例代碼不那麼本地化;有很多你使用的功能,但沒有定義。此外,內部循環中的'var' D:此外,您可能會發現[_named function expressions_](http://kangax.github.com/nfe/#named-expr)有用,但請注意它們符號在IE8-上出血。 –

回答

1

第一個提示:使用forEach

var array = []; 
getAnswers(mot, seuil).forEach(function(jarr) { 
    return getAnswers(jarr).forEach(function(karr) { 
    return getAnswers(karr).forEach(function(larr) { 
     var arraytemp = [mot, jarr, karr, larr]; 

     print(arraytemp); 
     array.push(arraytemp); 
    }); 
    }); 
}); 

而作爲Paul S.在他的評論中指出的那樣,你可能並不意味着在所有這些else分支使用continue

要回答你原來的問題,我認爲你在尋找這樣的事情:

/* Assumes that n >= 1 and depth(arr) > n */ 
function ndeep(arr, n, fn) { 
    function helper(acc, n) { 
    arr.forEach(function(narr) { 
     var nacc = acc.slice(); 
     nacc.push(narr); 

     if (n == 1) { 
     return fn(nacc); 
     } else { 
     return helper(nacc, n - 1); 
     } 
    }); 
    } 

    return helper([], n); 
} 

var array = []; 
ndeep(getAnswers(mot, seuil), depth, function(acc) { 
    array.push([mot].conat(acc)); 
}); 

...其中depth是你想要的深度。

+0

謝謝你的提示!是的,繼續聲明是一個錯誤。我編輯了我發佈的代碼,以便更容易理解。 –