不能在嵌套循环中调用递归函数

时间:2016-09-05 10:17:34

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

我正在尝试进行图遍历。由于所有顶点都没有连接。我需要从每个节点启动遍历。节点是二维数组。我从一个大文本文件中获取输入,这是我的工作方式:

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()函数没有返回值有关,因此循环不会继续。我尝试在return方法的基本情况下添加traverse,但没有成功。

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

1 个答案:

答案 0 :(得分:1)

你永远不应该(*)使用全局变量。您的WebElement ele = driver1.findElement(By.className("ace_string")); (可能还有其他)变量似乎是全局变量,这可能是您遇到问题的原因。

x, y, i, j看起来像某种&#34;维度&#34;您的数组/图形/其他的变量,所以最好将它们作为x & y的参数传递。 startTraversal是局部变量,因此它们应该在它们所使用的函数内声明(例如i & j)。将图形本身作为所有与图形相关的函数的参数传递也是一个好主意。

您还应该考虑使用Strict mode。其中一个限制是不允许您意外创建全局变量。

(*) - 当然有些情况下实际上需要全局变量,但它主要涉及创建某种全局,可重用模块或常量共享值的人。你永远不应该为你的&#34; local&#34;操作