为什么.foreach的行为与for不同..当执行递归回调时



我正在使用邻接列表编写一个递归深度优先图遍历,邻接列表是一个包含作为键的顶点和作为值的每个键的邻居的数组的对象。递归调用辅助函数来访问初始顶点的所有邻居,然后访问这些邻居的所有邻居等。

出于某种原因,使用"For…of"循环迭代每个邻居数组无法正常工作。helper函数将在邻居的邻居上调用,但当达到基本情况时,helper函数似乎不会在初始邻居的其他邻居上被调用,因此最终会出现永远无法到达的死胡同。

function depthFirstRecursiveTraversal(initialVertex) {
const adjacencyList = {
A: ['B', 'C'],
B: ['A', 'D'],
C: ['A', 'E'],
D: ['B', 'E', 'F'],
E: ['C', 'D', 'F'],
F: ['D', 'E']
};
let visited = {};
let vertexList = [];
function dfsHelper(v) {
if (!v) return null;
vertexList.push(v);
visited[v] = true;
// Why does a for-of loop fail here? Recursion fails to reach all vertices
//for (const neighbor of adjacencyList[v]) {
//  if (!visited[neighbor]) return dfsHelper(neighbor);
//}
// But using forEach instead works!
adjacencyList[v].forEach(neighbor => {
if (!visited[neighbor]) return dfsHelper(neighbor);
});
}
dfsHelper(initialVertex);
return vertexList;
}

调用depthFirstRecursiveTraversal(A(返回["A"、"B"、"D"、"E"、"C"、"F"],这是正确的。

但是,如果你评论出forEach并在for中评论。。。对于循环,它返回["A"、"B"、"D"、"E"、"C"]--从未到达"F"顶点。

作为参考,这是图的样子:

A
/   
B     C
|     |
D --- E
   /
F

有人能告诉我为什么。。。失败,但foreach有效?

for循环中,return将终止整个dfsHelper函数。相反,在forEach回调中,return只是终止回调。

返回值在这里并不重要,返回除了引入这个bug之外没有任何效果。最好从两个版本中删除return,如果这样做,for..of工作正常:

function depthFirstRecursiveTraversal(initialVertex) {
const adjacencyList = {
A: ['B', 'C'],
B: ['A', 'D'],
C: ['A', 'E'],
D: ['B', 'E', 'F'],
E: ['C', 'D', 'F'],
F: ['D', 'E']
};
let visited = {};
let vertexList = [];
function dfsHelper(v) {
if (!v) return null;
vertexList.push(v);
visited[v] = true;
for (const neighbor of adjacencyList[v]) {
if (!visited[neighbor]) dfsHelper(neighbor);
}
}
dfsHelper(initialVertex);
return vertexList;
}
console.log(depthFirstRecursiveTraversal('A'));

最新更新