7

在以下 Scala 函数示例中:

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

注释是在@tailrec做任何有用的事情,还是很高兴知道这是尾递归?

4

2 回答 2

9

@tailrec - 如果编译器无法在带注释的方法中执行尾调用优化,则会产生编译错误。

所以是的,它确实做某事....

退房 - http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html

于 2013-11-04T09:42:51.367 回答
2

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 而崩溃。虽然功能是一样的。

于 2019-02-19T10:17:45.453 回答