Вычисление факториала Kotlin

Привет! Сегодня мы рассмотрим несколько способов вычислить факториал Kotlin. На собеседовании иногда спрашивают это, поэтому лишним точно не будет. К тому же, один из вариантов будет основан на корутинах.

Итак, приступим!

Что такое факториал числа?

Факториалом числа n называется произведение чисел от 1 до числа n. Он часто используется в математике — мат. анализ, теория чисел, теория вероятности и другие разделы. Факториал функция растет значительно быстрее других функций, включая степенную и показательную.

Записывается он так:

5! = 1 х 2 х 3 х 4 х 5 = 120

Ничего сложного нет. Главное учесть что 1! = 1, чтобы не выполнять лишних вычислений.

Факториал Kotlin — Рекурсия

fun factRec(n: Int): Int {
    if( n!=1 ) {
        return n * factRec(n-1);
    } else return 1
}

Все просто, в условии мы проверяем не равняется ли наше число единице, и затем умножаем n на результат вызова этой же функции, только при n-1.

Вариант с when

Так как мы используем Kotlin, то можно переписать нашу функцию с использованием выражения when, которое мне очень нравится в языке.

fun factWhen(n: Int): Int {
    return when(n) {
        1 -> 1
        else -> n * factWhen(n-1)
    }
}

When() проверяет значение n и в зависимости от него возвращает значение. Все просто. Надо отметить, что рекурсия очень затратная для памяти операция, поэтому в качестве показательного кода на собеседовании сойдет, но лучше посмотреть что-то другое.

Факториал Kotlin с помощью корутин

Теперь настало время для «тяжелой артиллерии». Добавим в наш проект корутины, и посмотрим как они нам помогут в вычислении.

suspend fun factCor(num: Int): BigInteger =
    withContext(Dispatchers.IO) {
        var fact = BigInteger.ONE
        for (i in 1..num) {
            fact = fact.multiply(BigInteger.valueOf(i.toLong()))
        }
        fact
    }

Функция factCor() имеет модификатор suspend, который сообщает нам о том, что выполнение функции может быть приостановлено.

Далее вызовем withConext(Dispatchers.IO) который определят область(контекст) выполнения. В данном случае, Dispatchers.IO позволит использовать для вычисления факториала в Kotlin более одного потока и физического ядра процессора. Заменим также Integer на BigInteger, для того, чтобы не получить ошибку при подсчете больших значений факториала числа в Котлин.

Вызывать функцию factCor() можно только из такой же функции, поэтому ко главному методу fun main() надо добавить модификатор suspend

suspend fun main() {
    println( factCor(25) )
}

Выводы

В этой небольшой статье мы рассмотрели несколько способов как вычислить факториал в Kotlin, как при помощи рекурсии, так и использовав корутины. В дальнейшем мы изучим и другие базовые алгоритмы на Kotlin.

4 комментария

  1. А ещё вроде можно последовательности и использовать или flow?

  2. Василий Стрельников
    Василий Стрельников

    Кстати, а как подключать корутины без андройда?

    • Надо создать проект Gradle, и в настройках dependencies указать адрес.
      Можно также через Maven добавить без начала нового проекта так: Project Structure -> Libraries -> нажать плюс -> From Maven. Далее откроется окно и там в поиске ввести — org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3, где 1.3.3 версия корутин.
      Последнюю версию можно посмотреть тут — https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-core

      как подключить корутины в IntelliJ IDEA через maven

Оставить ответ