递归函数没有在嵌套循环中被调用
Recursive function not getting called in 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
的所有可能路径,并在它们上启动 traverse
。 traverse()
方法的大致结构如下:
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.
您永远、永远 (*) 使用全局变量。您的 x, y, i, j
(可能还有其他)变量似乎是全局变量,这可能是您出现问题的原因。
x & y
看起来像 array/graph/whatever 的某种 "dimensionality" 变量,因此最好将它们作为 startTraversal
的参数传递。 i & j
是局部变量,因此它们应该在使用它们的函数中声明(例如 for(var i = 0; i < x; i++)
)。将图形本身作为所有与图形相关的函数的参数传递也是一个好主意。
您还应该考虑使用 Strict mode。限制之一是您不得意外创建全局变量。
(*) - 当然在某些情况下确实需要全局变量,但它主要涉及人们创建某种全局的、可重用的模块或常量、共享值。你永远不应该为你的 "local" 操作使用全局变量。
我正在尝试进行图形遍历。因为所有的顶点都没有连接。我需要从每个节点开始遍历。节点位于二维数组中。我从一个大文本文件中获取输入,我是这样做的:
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
的所有可能路径,并在它们上启动 traverse
。 traverse()
方法的大致结构如下:
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.
您永远、永远 (*) 使用全局变量。您的 x, y, i, j
(可能还有其他)变量似乎是全局变量,这可能是您出现问题的原因。
x & y
看起来像 array/graph/whatever 的某种 "dimensionality" 变量,因此最好将它们作为 startTraversal
的参数传递。 i & j
是局部变量,因此它们应该在使用它们的函数中声明(例如 for(var i = 0; i < x; i++)
)。将图形本身作为所有与图形相关的函数的参数传递也是一个好主意。
您还应该考虑使用 Strict mode。限制之一是您不得意外创建全局变量。
(*) - 当然在某些情况下确实需要全局变量,但它主要涉及人们创建某种全局的、可重用的模块或常量、共享值。你永远不应该为你的 "local" 操作使用全局变量。