通用树的递归循环

时间:2018-08-17 07:38:50

标签: javascript recursion depth-first-search

几天来,我现在正试图解决以下问题。假定有一个递归函数遍历基本上是树的表示形式的字典。

输入看起来像这样:

var connections = {1:[2, 3, 4], 2:[5, 6, 7], 3:[8], 4:[9, 10]}

及其代表的相应树如下:

tree represented by the dictionary 'connections'

中间的目标是按照优先搜索的方式打印数字,即:

how the result should look like

我对这个问题的解决方案是:

function dfs(connections, parent) {
    console.log(parent);
    if (!(parent in connections)) {
      return;
    }

    for (i = 0; i < connections[parent].length; i++) {
      dfs(connections, connections[parent][i]);
    }
    return;
}

但是,调用函数

dfs(connections, 1)

导致以下结果:

1
2
5
6
7

这意味着它不会返回上一个函数并继续for循环。如果您有任何想法,我将不胜感激。

欢呼

1 个答案:

答案 0 :(得分:5)

您的i是隐式全局的,因此在遍历2(长度为3)之后,i为4,因此对i < connections[parent].length的进一步测试失败

您可以使用let对其进行修复(for (let i = 0),但是最好使用forEach来代替:数组方法不太冗长,更不易出错,并且更多比for循环更有用:

var connections = {
  1: [2, 3, 4],
  2: [5, 6, 7],
  3: [8],
  4: [9, 10]
}

function dfs(connections, parent) {
  console.log(parent);
  if (!(parent in connections)) {
    return;
  }
  connections[parent].forEach(prop => dfs(connections, prop));
}
dfs(connections, 1)