2016-01-26 5 views
2

Я понимаю проблему с рекурсивными функциями и риск проблем с переполнением стека.Необходимость аннотации @tailrec в Scala?

Однако, если функция может быть оптимизирована для хвостовой рекурсии, то почему эта оптимизация не применяется автоматически, т.е. почему мне нужно отметить функцию, которая может быть оптимизирована с помощью @tailrec?

+1

Я думаю, что идея будет заключаться в том, что вы получите ошибку, если она не может быть оптимизирована по хвосту против вашего ожидания. –

+5

Компилятор scala автоматически оптимизирует рекурсивные методы хвоста, я думаю, что аннотация tailrec полезна только для отладки Если вы не можете быть оптимизированы, вы получите сообщение об ошибке. –

+0

Итак, это похоже на проверку времени компиляции, чтобы узнать, была ли ваша функция написана, чтобы воспользоваться хвостовой рекурсией? – XOXO

ответ

4

если функция может быть оптимизирована для хвоста рекурсии, то почему бы не эта оптимизация автоматически применяется

Это является.

К сожалению, я не нашел цитату из SLS, которая бы это гарантировала.

Почему мне нужно отметить функцию, которая может быть оптимизирована с помощью @tailrec?

Примечания: Scala не гарантирует надлежащую хвостовую рекурсию для функций, только для методов!

Вы не комментируете методы, которые может быть оптимизирован. Вы комментируете методы, чтобы должен был быть оптимизирован, чтобы вы получили ошибку компиляции, когда они не могут оптимизировать.

См the documentation for scala.annotation.tailrec:

метод аннотаций, который проверяет, что метод будет скомпилирован с оптимизацией хвостового вызова.

Если он присутствует, компилятор выдаст ошибку, если метод не может быть оптимизирован в цикле.

Документация вводит в заблуждение точно , что оптимизирован («хвост оптимизации вызова», когда на самом деле Scala только оптимизирует прямой хвостовую рекурсию), но является четкое представление о цели аннотаций.

Причина этой аннотации заключается в том, что иногда интуиция людей о том, что есть и не является прямой рекурсией хвоста, может быть неправильной. Здесь много вопросов о SO формы: «Почему Scala не оптимизирует мой хвостовой рекурсивный метод», ответ которого «потому что он не хвостовой рекурсивный». (Here is an example of a method where the fact that it can't be optimized is non-obvious.) Итак, аннотируя метод, вы сообщаете как компилятору, так и вашим коллегам-разработчикам, что этот метод должен быть оптимизирован.

Смежные вопросы