Функция с хвостовой рекурсией (tailrec) в Kotlin — это рекурсивная функция, где рекурсивный вызов является последней операцией в теле функции. Это позволяет компилятору оптимизировать вызовы, преобразуя рекурсию в цикл, что предотвращает переполнение стека.
Что такое функция с хвостовой рекурсией (tailrec) в Kotlin?
Функция с хвостовой рекурсией (tailrec) в Kotlin — это рекурсивная функция, где рекурсивный вызов является последней операцией в теле функции.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Функция с хвостовой рекурсией (tailrec) в Kotlin — это рекурсивная функция, где рекурсивный вызов является последней операцией в теле функции. Это позволяет компилятору оптимизировать вызовы, преобразуя рекурсию в цикл, что предотвращает переполнение стека.
Для обозначения такой функции используется модификатор tailrec. Оптимизация действует только для вызовов, соответствующих требованиям. Не рассчитывайте на неё, если после рекурсивного вызова ещё выполняется работа; компилятор диагностирует неподходящие случаи.
Пример хвостовой рекурсии для вычисления факториала:
tailrec fun factorial(n: Int, acc: Int = 1): Int {
require(n in 0..12) { "Для Int поддерживается n от 0 до 12" }
return if (n <= 1) acc else factorial(n - 1, acc * n)
}
Здесь рекурсивный вызов factorial(n - 1, acc * n) — последний в функции, что позволяет оптимизировать вызов.
Пример ограничен факториалами 0..12 при начальном acc = 1: 13! уже не помещается в Int. tailrec оптимизирует стек вызовов, а не арифметику. Условия хвостовой оптимизации.