Jak działa @tailrec
Używałem i czytałem o@tailrec
adnotacja mająca rekurencyjną metodę ogona. Przeszedłem przez wiele linków, które to wyjaśniają. Na przykład działa tylko wtedy, gdy funkcje wywołujące się same nie powinny być zastępowane itd.
Wszędzie wspomina się, żecompiler optimizes
. Ale co magia / koncepcja robi kompilator, aby uczynić go rekurencyjnym. Dla prostej funkcji poniżej, co robi kompilator:
@tailrec def fact(acc: Int, n: Int): Int = {
if (n <= 1) acc
else fact(n * acc, n - 1)
}
fact(1,10)
To znaczy, czy konwertuje go do pętli, w której wielokrotnie go wywołuje, a następnie zwraca wartość końcową? Czy jest jakiś link do papieru, który to wyjaśnia