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

问题描述 投票:5回答:2

在以下Scala函数示例中:

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

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

scala annotations tail-recursion
2个回答
9
投票

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

所以是的它确实做了......

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


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将能够打印虚线,但是可能会使用StackOverFlowError崩溃.TrueTailRecursion会崩溃。虽然功能相同。

© www.soinside.com 2019 - 2024. All rights reserved.