В следующем примере функции Scala:
@tailrec def someFunction( ... ): Unit = {
Делает ли аннотация @tailrec что-нибудь полезное или просто приятно знать, что это хвостовая рекурсия?
В следующем примере функции Scala:
@tailrec def someFunction( ... ): Unit = {
Делает ли аннотация @tailrec что-нибудь полезное или просто приятно знать, что это хвостовая рекурсия?
@tailrec - вызовет ошибку компиляции, если оптимизацию хвостового вызова не может выполнить компилятор в аннотированном методе.
так что да, он что-то делает ....
проверить - http://blog.richdougherty.com/2009/04/tail-calls-tailrec-and-trampolines.html
Ответа 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. Хотя функция такая же.