Привет! Сегодня мы рассмотрим несколько способов вычислить факториал 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.
А ещё вроде можно последовательности и использовать или flow?
Да, можно sequences использовать. В планах рассмотреть последовательности более подробно
Кстати, а как подключать корутины без андройда?
Надо создать проект 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