簡體   English   中英

在 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實際上是從索引0 處的值開始的fold

我們從 2 開始,但是 1 將等同於乘以 1 不會改變結果。

編輯2:此編輯正是holi-java 剛剛發布的內容。

通過使用Range#fold和函數引用表達式,還有另一種表達方式,例如:

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

如果我如此大膽地不在 for 循環中進行,

這是一個方便的單線性遞歸函數來確定階乘:

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

階乘:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM