如果可能,Scala是否保证尾部递归优化?
假设我有以下代码如果可能,Scala是否保证尾部递归优化?,scala,tail-recursion,Scala,Tail Recursion,假设我有以下代码 def foo(x:Int):Unit = { if (x == 1) println ("done") else foo(scala.util.Random.nextInt(10)) } 是否保证编译器进行尾部递归优化?是。要确切知道,请将@tailrec注释添加到方法中。如果编译器不使用尾部递归进行编译,这将导致编译器抛出错误 @tailrec def foo(x:Int):Unit = { if (x == 1) println ("done") e
def foo(x:Int):Unit = {
if (x == 1) println ("done")
else foo(scala.util.Random.nextInt(10))
}
是否保证编译器进行尾部递归优化?是。要确切知道,请将
@tailrec
注释添加到方法中。如果编译器不使用尾部递归进行编译,这将导致编译器抛出错误
@tailrec
def foo(x:Int):Unit = {
if (x == 1) println ("done")
else foo(scala.util.Random.nextInt(10))
}
否,
单元
返回类型不相关
scala> @tailrec def f(i: Int) { if (i >= 0) { println(i); f(i - 1) } }
f: (i: Int)Unit
但是:
scala>@tailrecdef f(i:Int){if(i>=0){f(i-1);println(“.”}
:11:错误:无法优化@tailrec注释的方法f:
它包含一个不在尾部位置的递归调用
您需要将递归调用作为最后一个调用,返回类型无关紧要
您在问题中的代码很好,但问题的标题可能会误导您。我不知道Scala能为您提供什么保证,但在一般情况下,JVM不会实现尾部递归。(tailrec调用没有JVM字节码)@Basile Starynkevitch:Scala可以编译简单的尾部递归到循环的例子。有些JVM“自动”支持尾部递归,但不幸的是Oracle不支持。在Scala 2.8中,我不得不导入Scala.annotation.tailrec。尝试打破它。在方法的底部添加一个额外的()以便它在调用后执行某些操作,但仍然返回单位。我的意思是你的建议有效,我只需要添加导入。不用担心。我第一次就知道了。我的意思是,如果没有一个正确的尾部递归函数,您应该使用它并查看编译器是否会出错。
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