作为 Scala 的新手,我把这个问题作为对自己的一个很好的练习,并希望与大家分享我的解决方案。欢迎任何意见!
顺便说一句,@Eastsun 给出的解决方案是深度优先搜索,它“记住”每条路径中的访问节点,而我的是广度优先搜索,不需要记忆(尽管您绝对可以添加此功能以提高效率)。对于树,它们产生相同的答案,但对于一般图,它们可能会有所不同。
每个节点的邻居也可以被缓存以进行优化。
val graph = Vector(("A","B"), ("A","C"), ("C","D"), ("C","E"))
def adjacent(a: String) = {
graph flatMap {
case (`a`, x) => Some(x)
case (x, `a`) => Some(x)
case _ => None
}
}
def go(from: String, to: String) {
def expand(paths: Vector[Vector[String]]) {
paths.find(_.last==to) match {
case Some(x) => println(x); return
case None => expand(paths flatMap { e =>
adjacent(e.last) map (e :+ _)
})
}
}
expand(Vector(Vector(from)))
}
// tests
go("A","E") // Vector(A, C, E)
go("B","E") // Vector(B, A, C, E)
go("D","E") // Vector(D, C, E)
带记忆的版本:更改
adjacent(e.last) map (e :+ _)
至
adjacent(e.last) filterNot (x => paths.flatten contains x) map (e :+ _)
或将此功能放在相邻的功能中。