将以下函数转换为尾递归形式

时间:2014-09-29 03:24:18

标签: algorithm scala recursion tail-recursion

基本上我有以下算法遍历表示为边缘列表的图形数据结构。

如何将以下递归函数转换为尾递归形式:

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

1 个答案:

答案 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))
   }