如何使用缓存(每个节点访问一次)或距离等新问题撰写一个简单的breadth-first traversal图表。
与距离:
def breadth_first_traverse2[Node](node: Node, f: Node => Seq[Node]): Stream[(Node, Int)] = {
def recurse(q: Queue[(Node, Int)]): Stream[(Node, Int)] = {
if (q.isEmpty) {
Stream.Empty
} else {
val ((node, i), tail) = q.dequeue
(node, i) #:: recurse(tail ++ f(node).map((_, i+1)))
}
}
(node, 0) #:: recurse(Queue.empty ++ f(node).map((_, 1)))
}
带缓存的:
def breadth_first_traverse[Node](node: Node, f: Node => Seq[Node]): Stream[Node] = {
def recurse(q: Queue[Node], cache: Set[Node]): Stream[Node] = {
if (q.isEmpty) {
Stream.Empty
} else {
val (node, tail) = q.dequeue
val nodes = f(node).filterNot(cache.contains)
node #:: recurse(tail ++ nodes, cache ++ nodes)
}
}
node #:: recurse(Queue.empty ++ f(node), Set.empty)
}
我已经提出了这些实现。 问题是新的问题与简单的实现混合在一起,因此我无法构建具有缓存和距离的新实现。
如果我还想将路径从root返回到节点......
我想知道FP模式(例如State
或Traverse
)是否有帮助?
是否有更清洁设计的想法?