在 Kotlin 中使用 `for` 循环的阶乘
Factorial using `for` loop in Kotlin
有了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
循环来完成此操作。
谢谢
好吧,想到的最简单的:
fun factorial(num: Int): Long {
var result = 1L
for (i in 2..num) result *= i
return result
}
这不使用 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 刚刚发布的内容。
如果我胆子大到不在for循环里做,
这是一个方便的单线性递归函数来确定阶乘:
fun factorial(a: Int): Long = if (a == 1) a.toLong() else factorial(a - 1) * a
还有一种表达式是用Range#fold和函数引用表达式,例如:
fun factorial(n: Int) = (2..n).fold(1L, Long::times)
阶乘:
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")
}
使用递归的替代方法:
fun factorial(number: Int): Int {
when (number) {
0 -> return 1
else -> return number * factorial(number - 1)
}
}
其他方式:
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;
}
有了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
循环来完成此操作。
谢谢
好吧,想到的最简单的:
fun factorial(num: Int): Long {
var result = 1L
for (i in 2..num) result *= i
return result
}
这不使用 for 循环,但作为补充,您还可以使用 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
实际上是一个 fold
从索引 0 开始的值。
我们从 2 开始,但是 1 是等效的,因为乘以 1 不会改变结果。
编辑 2:此编辑正是 holi-java 刚刚发布的内容。
如果我胆子大到不在for循环里做,
这是一个方便的单线性递归函数来确定阶乘:
fun factorial(a: Int): Long = if (a == 1) a.toLong() else factorial(a - 1) * a
还有一种表达式是用Range#fold和函数引用表达式,例如:
fun factorial(n: Int) = (2..n).fold(1L, Long::times)
阶乘:
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")
}
使用递归的替代方法:
fun factorial(number: Int): Int {
when (number) {
0 -> return 1
else -> return number * factorial(number - 1)
}
}
其他方式:
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;
}