Я использовал и читал об аннотации @tailrec
, чтобы иметь хвостовой рекурсивный метод. Я объяснил это многими ссылками. Например, он работает только тогда, когда для функций самообслуживания и не должен превышать и т.д.
Всюду упоминается, что compiler optimizes
. Но какая магия/концепция делает компилятор, чтобы сделать его хвостом рекурсивным. Для простой функции ниже, что делает компилятор:
@tailrec def fact(acc: Int, n: Int): Int = {
if (n <= 1) acc
else fact(n * acc, n - 1)
}
fact(1,10)
Я имею в виду, он преобразует его в цикл, где он повторно вызывает его, а затем возвращает окончательное значение? Есть ли ссылка на бумагу, которая объясняет это.