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