Нужно ли мне использовать @tailrec в Scala?

В следующем примере функции Scala:

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

Делает ли аннотация @tailrec что-нибудь полезное или просто приятно знать, что это хвостовая рекурсия?


person JamboShrimp    schedule 04.11.2013    source источник


Ответы (2)


@tailrec - вызовет ошибку компиляции, если оптимизацию хвостового вызова не может выполнить компилятор в аннотированном методе.

так что да, он что-то делает ....

проверить - http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html

person Nimrod007    schedule 04.11.2013
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - person zero323; 04.11.2013
comment
Я думаю, что в моем ответе достаточно данных, чтобы ответить на вопрос, если вы хотите узнать больше, прочитайте больше ... - person Nimrod007; 04.11.2013

Ответа 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. Хотя функция такая же.

person shri    schedule 19.02.2019