在Kotlin中使用`for`循环的因子

时间:2017-07-19 15:04:30

标签: loops kotlin factorial

凭借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循环帮助我这样做。

由于

7 个答案:

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