在以下Scala函数示例中:
@tailrec def someFunction( ... ): Unit = {
@tailrec
注释是否有用,或者知道这是尾递归是否真的很好?
@tailrec - 如果编译器在注释方法中无法执行尾调用优化,则会产生编译错误。
所以是的它确实做了......
退房 - http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html
Nimrod007的答案已经足够,但我也想补充一些观点。
添加@tailrec
肯定会清除代码中的疑问。您的IDE可能会将函数检测为尾递归,但Scala可能不会,这就是为什么最好将@tailrec
添加到函数中。
您可以参考以下代码。
import scala.annotation.tailrec
object Application extends App {
println("Hello World")
val i = 60000
// val i = 1000
GetSum().trueTailRecursion(i)
println("\nCompleted")
GetSum().maybeTrueTailRecursion(i)
}
case class GetSum() {
def maybeTrueTailRecursion(i: Int): Int = {
print(".")
if(i==1) 1
else maybeTrueTailRecursion(i - 1)
}
@tailrec
final def trueTailRecursion(i: Int): Int = {
print(".")
if(i==1) 1
else trueTailRecursion(i - 1)
}
}
在上面的例子中,trueTailRecursion将能够打印虚线,但是可能会使用StackOverFlowError崩溃.TrueTailRecursion会崩溃。虽然功能相同。