Хвостовая рекурсия в Kotlin
Рекурсивная функция снова вызывает сама себя. Если таких вызовов много подряд, стек растет. Когда последнее действие в ветке - только следующий рекурсивный вызов, компилятор Kotlin может заменить цепочку на цикл.
Такой прием называют хвостовой рекурсией. Ее
отмечают словом tailrec перед fun.
Накопитель передают параметром, а не ждут после
возврата из вложенного вызова:
tailrec fun sumDown(n: Int, acc: Int = 0): Int {
return if (n == 0) {
acc
} else {
sumDown(n - 1, acc + n)
}
}
Ключевое слово tailrec требует, чтобы рекурсивный вызов
стоял последним вычислением в каждой ветке.
Сумма чисел от 1 до n при этом
считается без отдельного цикла в исходнике:
fun main() {
println(sumDown(5))
}
Напишите рекурсивную функцию, которая считает
факториал числа n в параметре
acc. Для 5 выведите 120.
Сделайте функцию, которая по списку строк возвращает их общую длину, уменьшая список рекурсивно. Проверьте на трех коротких словах.