假设我有以下代码
def foo(x:Int):Unit = {
if (x == 1) println ("done")
else foo(scala.util.Random.nextInt(10))
}
是否可以保证编译器进行尾递归优化?
答案 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
您需要将递归调用作为最后一次调用,返回类型无关紧要。
你在问题中的代码很好,但问题的标题会产生误导。