2012-12-30 71 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

谢谢你的提示!是的,继续声明是一个错误。我编辑了我发布的代码,以便更容易理解。 –