Репликация Котлина

fun fact(x: Int): Int{ tailrec fun factTail(y: Int, z: Int): Int{ if (y == 0) return z else return factTail(y - 1, y * z) } return factTail(x, 1) } 

Может ли кто-нибудь объяснить мне, как эта функция рекурсии работает в котлин?

    Я начну говорить, что ключевое слово tailrec используется только как оптимизация для компилятора, который попытается выразить функцию с помощью цикла, а не с рекурсией, избегая риска переполнения стека .

    Если мы избежим рекурсии, функция может выглядеть примерно так:

      fun fact(x: Int): Int { var result = x for (i in x - 1 downTo 1) { result *= i } return result } 

    Существует большой риск, когда вы используете рекурсию в kotlin, которая является stackoverflow.

    стек

    Как и выше рекурсия изображения работает в котлин. Будет максимальный размер для стека. Если наша функция рекурсии будет бесконечной, то она пересечет максимальный размер и приведет к исключению StackOverflow. Поэтому избегайте использования рекурсии и использования цикла

    Intereting Posts
    RxJava 2 требует другого типа возвращаемого типа, чем RxJava 1 (Kotlin) Каков правильный подход к «Этот класс AsyncTask должен быть статическим или может возникнуть утечка» в Kotlin Android? Kotlin: как передать массив в аннотацию Java Обнаружение событий касания в оверлее и передача их дальше Есть ли какая-либо ссылка на временную сложность библиотеки коллекции Kotlin? Методы ведения журнала Anko не могут быть решены Escape зарезервированные слова в импорте Location имеет значение null, если GoogleMap не инициализируется снова Создание комментариев метода / класса Kotlin Вызов общего метода на нескольких приемниках Проблемы подтипа с дженериками в Котлине Я хочу, чтобы каждый элемент массива каждого массива отображался в виде единого кадра Как аргумент Default и @JvmOverloads работают над Kotlin? Интерфейс реализации класса Kotlin anonim AspectJ Проблемы компилятора с передачей kotlin в иерархии типов