我需要在Scala中使用@tailrec吗?

时间:2013-11-04 09:42:22

标签: scala annotations tail-recursion

在以下Scala函数示例中:

@tailrec def someFunction( ... ): Unit = {

@tailrec注释是否有用,或者知道这是尾递归是不是很好?

2 个答案:

答案 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而崩溃。 虽然功能相同。