【问题标题】:Javascript: recursion + for loop + scopeJavascript:递归 + for 循环 + 作用域
【发布时间】:2023-03-26 10:18:01
【问题描述】:

过去几天我一直在尝试解决这个问题,但直到现在我还没有找到解决方案。

下面的代码递归地在图上查找路径。它似乎不是输出带有四个节点的nodePath,而是输出“一个nodePath”,每个周期都有一个新添加的节点(导致路径从1个增加到200多个节点)。递归路径调用似乎没有创建一个新的“nodePath”,但它使用了邻居[node_nw] 和深度。

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)和主题,但没有一个能帮助我解决这个问题。

任何帮助将不胜感激!

【问题讨论】:

    标签: javascript for-loop recursion scope


    【解决方案1】:

    这不是作用域、闭包或递归问题,而是引用问题

    您始终使用相同的 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 demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      相关资源
      最近更新 更多