是否可以在Scala中保证尾递归优化?

时间:2011-11-17 06:52:21

标签: scala tail-recursion

假设我有以下代码

def foo(x:Int):Unit = {
   if (x == 1) println ("done")
   else foo(scala.util.Random.nextInt(10))
}

是否可以保证编译器进行尾递归优化?

2 个答案:

答案 0 :(得分:12)

是。要确保将@tailrec注释添加到方法中。如果编译器不使用尾递归进行编译,这将导致编译器抛出错误。

@tailrec
def foo(x:Int):Unit = {
  if (x == 1) println ("done")
  else foo(scala.util.Random.nextInt(10))
}

答案 1 :(得分:3)

Unit返回类型无关紧要。

scala> @tailrec def f(i: Int) { if (i >= 0) { println(i); f(i - 1) }  }
f: (i: Int)Unit

可是:

scala> @tailrec def f(i: Int) { if (i >= 0) { f(i - 1); println(".") }  }
<console>:11: error: could not optimize @tailrec annotated method f:
  it contains a recursive call not in tail position

您需要将递归调用作为最后一次调用,返回类型无关紧要。

你在问题​​中的代码很好,但问题的标题会产生误导。