基本上我有以下算法遍历表示为边缘列表的图形数据结构。
如何将以下递归函数转换为尾递归形式:
def nonTailRec(arg1: Int): Seq[Int] = {
val dependencies: Seq[Int] = traverse(arg1)
if (dependencies.size > 0) {
val b = dependencies.map { dependency => nonTailRec(dependency) }.flatten
dependencies ++ b
}
else {
Seq()
}
}
traverse
是一个函数,当给定顶点id时,将返回直接连接到它的顶点ID Set
。
答案 0 :(得分:1)
为了能够递归地编写这个函数,你需要传递当前状态(累积的依赖关系)和"节点"需要稍后检查。这是我的尾递归版本,但是如果您的图表中有周期,那么它将失败,以解决您需要从" toVisit"中排除已访问过的节点:
def traverse(i: Int): Seq[Int] = ???
def nonTailRec(arg1: Int): Seq[Int] = {
@tailrec def step(dependsOn: Seq[Int], toVisit: Seq[Int]): Seq[Int] = {
toVisit match {
case x :: xs => step(dependsOn :+ x, xs ++ traverse(x))
case x :: Nil => step(dependsOn :+ x, traverse(x))
case Nil => dependsOn
}
}
step(Nil, traverse(arg1))
}