Domanda

In the following example of a Scala function:

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

Is the @tailrec annotation doing anything useful or is it just nice to know that this is a tail recursion?

È stato utile?

Soluzione

@tailrec - will produce a compilation error if a tail call optimization cannot be performed by the compiler in the annotated method.

so yes it does do something ....

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

Altri suggerimenti

Nimrod007' answer is sufficient, But I also like to add some points.

Adding @tailrec definitely clears a benefit of doubt in code. You IDE might detect function as tail recursive but Scala might not, This is why it is better to add @tailrec to the function.

You can refer the code below.

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)
  }

}

In the above example, trueTailRecursion will be able to print dotted line but maybeTrueTailRecursion will crash with StackOverFlowError. Although the function is same.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top