在过去的几天里,我一直试图解决这个问题,但直到现在我还没有找到一个解决方案。
下面的代码递归地查找图上的路径。而不是输出nodePath的四个节点,它似乎输出'一个nodePath'与一个新添加的节点从每个周期(导致路径从1到200+节点增量)。递归路径调用似乎不会创建一个新的'nodePath',但是它会与邻居[node_nw]和depth一起创建。
var startNode = s.graph.nodes('n0');
var emptyNodeRoute = [];
path(startNode, 0, emptyNodeRoute);
function path (node, depth, nodePath) {
nodePath.push(node);
if (depth == 3) {
printPath (nodePath);
} else {
depth ++;
var neighbors = s.graph.neighbors(node.id);
for (var node_nw in neighbors) {
(function() {
path (neighbors[node_nw], depth, nodePath);
}());
}
}
}
//prints node route
function printPath (nodePath) {
var str = '';
for(var k = 0; k < nodePath.length; k++) {
str = str.concat(' ', nodePath[k].label);
}
console.log ('nodePath: ' + str);
}
我猜这与javascript的特异性有关(没有)块作用域,闭包和递归?或者是我忽略的一些小事?我参考了一些资源(在http://zef.me/2843/javascript-the-scope-pitfall中)和这个网站上的主题,但没有一个能让我解决这个问题。
任何帮助都将非常感激!
这不是作用域、闭包或递归问题,而是引用问题。
始终使用相同的nodePath
引用调用path
函数。复制nodePath
变量,一切工作如预期。
这里是你需要改变的:
for (var node_nw in neighbors) {
// the method slice makes a copy of the array
path (neighbors[node_nw], depth, nodePath.slice());
}
看一下jsFiddle演示。