凭借java编程经验,我今天开始学习Kotlin。我正在玩这种语言,发现我坚持在kotlin中使用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
}
请使用for
循环帮助我这样做。
由于
答案 0 :(得分:10)
嗯,这是我想到的最简单的一个:
fun factorial(num: Int): Long {
var result = 1L
for (i in 2..num) result *= i
return result
}
答案 1 :(得分:4)
这不使用for循环,但作为一个补充,你也可以使用reduce
使它更短,更实用,更像Kotlin:
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
实际上是fold
,从索引0的值开始。
我们从2开始,但是1相当于乘以1不会改变结果。
编辑2:这个编辑正是holi-java刚发布的。
答案 2 :(得分:2)
使用Range#fold和函数引用表达式,还有另一个富有表现力的,例如:
fun factorial(n: Int) = (2..n).fold(1L, Long::times)
答案 3 :(得分:0)
如果我大胆地不在for循环中执行,
这是一个方便的单线性递归函数来确定阶乘:
fun factorial(a: Int): Long = if (a == 1) a.toLong() else factorial(a - 1) * a
答案 4 :(得分:0)
<强>阶乘:强>
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")
}
答案 5 :(得分:0)
使用递归的替代方法:
fun factorial(number: Int): Int {
when (number) {
0 -> return 1
else -> return number * factorial(number - 1)
}
}
答案 6 :(得分:0)
其他方式:
fun factorial (data : Int) : Long {
var result : Long = 1
(1..data).map {
result *= it;
}
return result;
}
如果要使用BigInteger:
fun factorial (data : Int) : BigInteger {
var result : BigInteger = 1.toBigInteger()
(1..data).map {
result *= it.toBigInteger();
}
return result;
}