几天来,我现在正试图解决以下问题。假定有一个递归函数遍历基本上是树的表示形式的字典。
输入看起来像这样:
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;
}
for (i = 0; i < connections[parent].length; i++) {
dfs(connections, connections[parent][i]);
}
return;
}
但是,调用函数
dfs(connections, 1)
导致以下结果:
1
2
5
6
7
这意味着它不会返回上一个函数并继续for循环。如果您有任何想法,我将不胜感激。
欢呼
答案 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)