我在Scala中看到过以下代码,它首先遍历图的深度:
def dfs(node: Node, seen: Set[Node]) = {
visit(node)
node.neighbours.filterNot(seen).foreach(neighbour => dfs(node, seen + node))
}
在我看来,这段代码是不正确的,如下面的示例所示。
结点为1、2、3。边为1 -〉3、1 -〉2、2 -〉3dfs(1, Set.empty)
将访问节点1,然后是节点3,然后是节点2,然后再次访问节点3,因为我们没有维护全局可见节点集,而只是在递归调用dfs
时添加它们。
在Scala中,如果不使用可变结构,正确的DFS实现是什么?
1条答案
按热度按时间bis0qfac1#
类似这样的东西应该可以工作(尽管你可能会认为foldLeft有一点欺骗):