【问题标题】:Recursive function not getting called in nested loops递归函数没有在嵌套循环中被调用
【发布时间】:2016-09-05 10:17:34
【问题描述】:

我正在尝试进行图形遍历。因为所有顶点都没有连接。我需要从每个节点开始遍历。节点位于二维数组中。我从一个大文本文件中获取输入,这是我的做法:

lr.on('end', function(){
 //Callback called when file reading is complete
 initialize(); //initialize stuff
 startTraversal();
});

startTraversal() 方法定义为:

 function startTraversal(){
   for(i=0;i<x;i++){
    for(j=0;j<y;j++){
        console.log(i+', '+j);
        traverse(i,j); //Call Traverse i,j every time once
    }
   }
 }

traverse(i,j) 是一个递归函数。因此,我查看了节点 i,j 的所有可能路径并在它们上启动 traversetraverse() 方法的大致结构如下:

function traverse(i,j){
var possible = getAdjacent(i,j); //getPossible Routes
if(possible.length == 0){
    //do stuff
    return; //Tried adding return statement here
}

else{
    for(x=0;x<possible.length;x++){
        if(!data[a][b].visited) //if node is not visited
            traverse(a,b);

        //Do further stuff when this ^ call returns, finding max etc
        ...
       } //End of for
    }
}

现在在startTraversal() 函数调用中,内部循环仅针对i 的第一个值执行,我从console.log 确认了这一点。我无法理解为什么循环没有得到进一步执行。

PS:当我手动将嵌套循环放在任何回调之外时,循环和遍历会按预期完成。但是,只有在完全读取文件时,我才需要启动 startTraversal() 方法。我想这与traverse() 函数没有返回值有关,因此循环不会继续。我尝试在traverse 方法的基本情况下添加return,但没有成功。

对此问题的任何见解都深表感谢。想知道如何处理嵌套循环中的递归调用,至少在 javascript 中。

【问题讨论】:

  • 您确实必须在函数中声明变量...目前所有循环共享相同的计数器。
  • 拜托,getAdjacent() 方法,它有回调吗?当您说仅针对 i 的第一个值执行内部循环时,您的意思是值 0?实际上我想知道你没有写的代码是否包含回调方法
  • 我看不到所有循环如何使用相同的计数器。我将变量ij 作为参数传递给traverse 函数。它们将按值传递。
  • @Ediruth, getAdjacent() 方法没有回调。它只返回一个array
  • x in for(x=0;x&lt;possible.length;x++) 与所有递归函数调用共享。

标签: javascript node.js algorithm recursion nested-loops


【解决方案1】:

您永远不应该 (*) 使用全局变量。您的 x, y, i, j(可能还有其他)变量似乎是全局变量,这可能是您的问题的原因。

x &amp; y 看起来像是数组/图形/任何东西的某种“维度”变量,因此最好将它们作为startTraversal 的参数传递。 i &amp; j 是局部变量,因此应在使用它们的函数中声明它们(例如for(var i = 0; i &lt; x; i++))。将图形本身作为所有图形相关函数的参数传递也是一个好主意。

您还应该考虑使用Strict mode。限制之一是您不得意外创建全局变量。


(*) - 当然,在某些情况下,实际上需要全局变量,但它主要涉及创建某种全局、可重用模块或常量、共享值的人。你不应该在你的“本地”操作中使用全局变量。

【讨论】:

  • 感谢@mdziekon 指出严格模式。事实上,我在导致错误的函数中重用了x
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多