Факториал с использованием цикла `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") }