在 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;
    }