在以下Scala函数示例中:
@tailrec def someFunction( ... ): Unit = {
@tailrec
注释是否有用,或者知道这是尾递归是不是很好?
答案 0 :(得分:9)
@tailrec - 如果编译器在带注释的方法中无法执行尾调用优化,则会产生编译错误。
所以是的它确实有所作为......
结帐 - http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html
答案 1 :(得分:0)
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将能够打印虚线,但是 可能TrueTailRecursion会因StackOverFlowError而崩溃。 虽然功能相同。