`tailrec` prosi kompilator o zamianę rekurencji ogonowej na pętlę (bez rosnącego stosu wywołań). Działa tylko dla bezpośredniej rekurencji, gdzie wywołanie rekurencyjne jest ostatnią operacją (tail position). Jeśli funkcja nie jest naprawdę ogonowa, kompilator nie zastosuje optymalizacji.
Odpowiedź zaawansowana
Głębiej
Rozwinięcie krótkiej odpowiedzi — co zwykle ma znaczenie w praktyce:
JVM: pamięć (heap/stack), GC i co wpływa na latency.
Kontrakty: equals/hashCode/toString, mutowalność i konsekwencje.
Wydajność: boxing, alokacje, kolekcje, inlining.
Wytłumacz "dlaczego", nie tylko "co" (intuicja + konsekwencje).
Trade-offy: co zyskujesz i co tracisz (czas, pamięć, złożoność, ryzyko).
Edge-case’y: puste dane, duże dane, błędne dane, współbieżność.
Przykłady
Krótki przykład (szablon do wyjaśniania):
// Example: discuss trade-offs for "`tailrec`:-co-robi-i-kiedy-kotlin-może-zoptymali"
function explain() {
// Start from the core idea:
// `tailrec` prosi kompilator o zamianę rekurencji ogonowej na pętlę (bez rosnącego stosu wyw
}
Typowe pułapki
Zbyt ogólna odpowiedź (brak konkretów, brak przykładów).
Brak rozróżnienia między "średnio" a "najgorzej" (np. złożoność).