Kotlin中使用`for`循环计算阶乘

7

有着Java编程经验的我,今天开始学习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 循环帮我完成这个任务。
谢谢。
7个回答

15

嗯,最简单的方法是:

fun factorial(num: Int): Long {
    var result = 1L
    for (i in 2..num) result *= i
    return result
}

7
这不使用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 刚刚发布的内容完全相同。


0的阶乘怎么办?使用factorial(0)似乎不起作用,而使用折叠函数的解决方案可以。 - stefano

2

通过使用Range#fold和函数引用表达式,还有另一种更具表现力的方法,例如:

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

0

如果我大胆地不使用for循环来完成它,

这里有一个方便的一行递归函数来确定阶乘:

fun factorial(a: Int): Long = if (a == 1) a.toLong() else factorial(a - 1) * a

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

0

使用递归的替代方案:

fun factorial(number: Int): Int {
    when (number) {
        0 -> return 1
        else -> return number * factorial(number - 1)
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接