Факториал с использованием цикла `for` в Котлине

Имея опыт программирования на Java, я начал изучать Котлин сегодня. Я играю на языке и обнаружил, что я застрял, чтобы найти факториальное использование for цикла в котлин. Мне удалось сделать это, используя цикл while.

 import java.util.Scanner fun main(args: Array<String>){ val reader=Scanner(System.`in`) val x: Int = reader.nextInt() println(factorial(x)) } fun factorial(a: Int): Int{ var ans=1 var i: Int = a while(i>1){ ans*=i i-- } return ans } в import java.util.Scanner fun main(args: Array<String>){ val reader=Scanner(System.`in`) val x: Int = reader.nextInt() println(factorial(x)) } fun factorial(a: Int): Int{ var ans=1 var i: Int = a while(i>1){ ans*=i i-- } return ans } 

Пожалуйста, помогите мне сделать это, используя цикл for .

благодаря

Ну, самый простой, который приходит на ум:

 fun factorial(num: Int): Long { var result = 1L for (i in 2..num) result *= i return result } 

Это не использует цикл for, но, как дополнение, вы также можете сделать это более коротким, более функциональным и похожим на Kotlin, используя reduce :

 fun factorial(num: Int) = (1..num).reduce(Int::times) 

Или:

 fun factorial(num: Int) = (1..num).reduce { a, b -> a * b } 

Это самое простое, о котором я могу думать.

Изменить: это эквивалентно

 fun factorial(num: Int) = (2..num).fold(1, Int::times) 

так как reduce практически reduce к значению с индексом 0.

Мы начинаем с 2 вместо этого, однако 1 будет эквивалентным, поскольку умножение на единицу не изменяет результат.

Редактировать 2: это редактирование – это именно то, что только что опубликовано в холи-джаве.

есть еще один выразительный , используя выражение Range # fold и выражение для ссылки функции, например:

 fun factorial(n: Int) = (2..n).fold(1L, Long::times) 

Если я настолько смел, чтобы не делать этого в цикле for,

Вот удобная рекурсивная функция для определения факториала:

 fun factorial(a: Int): Long = if (a == 1) a.toLong() else factorial(a - 1) * a 

Факториал:

 fun factorial(num : Long) : Long { var factorial : Long = 1 for (i in 2..num) { factorial *= i } println("Factorial of $num = $factorial") } 

Факториал с использованием переменной BigInteger:

 fun factorial(num : Long) : Long { var factorial = BigInteger.ONE for (i in 2..num) { factorial = factorial.multiply(BigInteger.valueOf(num)) } println("Factorial of $num = $factorial") } 
Intereting Posts
Класс Kotlin, реализующий ошибку интерфейса Java Как подсчитать методы в библиотеке Котлин Для функции Kotlin, используемой в качестве выражения, существует ли краткий способ работы и возврата значения? Android Kotlin onItemSelectedListener для неработающего счетчика Котлин рекомендовал отменить регистрацию слушателя с помощью SAM Переменная Kotlin String в параметре функции auto cast to java.lang.String, почему? Как продолжить обработку после ошибки в RxJava 2? Спящий режим с Kotlin: @ManyToOne (fetch = FetchType.LAZY) ProGuard заставляет Gson возвращать LinkedTreeMap вместо моего типа Что эквивалентно статическим методам Java в Котлине? Как вы объявляете полиморфное поле, которое использует JsonTypeInfo.As.WRAPPER_OBJECT с Jackson XML? Hibernate сохраняет дочерний объект с нулевым родительским идентификатором Как переопределенные свойства обрабатываются в блоках init? Динамическое развертывание и запуск узлов в CORDA Расширение файла загрузки.