Назад к вопросам
Middle
106
questionbank
Что такое функция с хвостовой рекурсией и как она работает в языке Kotlin?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Функция с хвостовой рекурсией — это функция, в которой рекурсивный вызов является последним действием перед возвратом значения.
Особенности и принцип работы в Kotlin:
- Аннотация
tailrec: Kotlin требует явной аннотации@tailrecдля функций, которые должны быть оптимизированы с помощью хвостовой рекурсии. - Оптимизация компилятором: Если функция аннотирована как
tailrecи соответствует критериям хвостовой рекурсии (рекурсивный вызов — последнее действие, результат вызова не используется в других вычислениях), компилятор оптимизирует ее. - Трансформация в цикл: Оптимизация заключается в трансформации рекурсивного вызова в обычный цикл
while. Это позволяет избежать роста стека вызовов и, как следствие, предотвращает переполнение стека при большом количестве рекурсивных вызовов. - Предотвращение StackOverflowError: Основное преимущество — возможность эффективно работать с глубокими рекурсивными вызовами, не опасаясь исключения
StackOverflowError.
Пример:
// Неоптимизированная рекурсия - может вызвать StackOverflowError для больших N
fun factorialRecursive(n: Long): Long {
return if (n <= 1) 1 else n * factorialRecursive(n - 1)
}
// Функция с хвостовой рекурсией
tailrec fun factorialTailrec(n: Long, accumulator: Long = 1): Long {
return if (n <= 1) accumulator else factorialTailrec(n - 1, n * accumulator)
}
fun main() {
println(factorialTailrec(5)) // Выведет 120
}