在Kotlin中使用`for`循环的因子

有了java编程的经验,我开始学习Kotlin。 我正在玩的语言,发现我坚持找到一个阶乘使用循环kotlin。 我设法使用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 } 

请帮我做一个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实际上是从索引0处的值开始的fold

我们从2开始,但是1乘以1不会改变结果。

编辑2:这个编辑正是刚刚发布的holi-java。

还有另外一种表达方式是使用Range#fold和函数的引用表达式,例如:

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

如果我这么大胆,不想在循环中做,

这是一个方便的单线程递归函数来确定阶乘:

 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") }