在以下 Scala 函数示例中:
@tailrec def someFunction( ... ): Unit = {
注释是在@tailrec
做任何有用的事情,还是很高兴知道这是尾递归?
在以下 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 将能够打印虚线,但可能 TrueTailRecursion 会因 StackOverFlowError 而崩溃。虽然功能是一样的。