Компилятор Scala автоматически оптимизирует любой действительно хвосторекурсивный метод. Если вы аннотируете метод, который, по вашему мнению, является хвосторекурсивным, с помощью @tailrec
аннотации, компилятор предупредит вас, если метод на самом деле не является хвосторекурсивным. Это делает @tailrec
аннотацию хорошей идеей как для обеспечения возможности оптимизации метода в настоящий момент, так и для сохранения возможности оптимизации при изменении.
Обратите внимание, что Scala не считает метод хвостовым рекурсивным, если его можно переопределить. Таким образом, метод должен быть закрытым, окончательным, для объекта (в отличие от класса или признака) или внутри другого метода, который нужно оптимизировать.
override
аннотации в Java - код работает и без нее, но если вы поместите его туда, он сообщит вам, если вы сделали ошибку.Аннотация есть
scala.annotation.tailrec
. Он вызывает ошибку компилятора, если метод не может быть оптимизирован для хвостового вызова, что происходит, если:Он помещается непосредственно перед
def
в определении метода. Работает в REPL.Здесь мы импортируем аннотацию и пытаемся пометить метод как
@tailrec
.Ой! Последний призыв -
1.+()
нетlength()
! Переформулируем метод:Обратите внимание, что
length0
это автоматически закрытый, потому что он определен в области действия другого метода.источник