2017-07-19 18 views
3

隨着Java編程的經驗,我開始學習Kotlin。我正在玩這種語言,發現我堅持使用kotlin中的for循環來找到一個因子。我設法使用while循環來做到這一點。在Kotlin中使用`for`循環的因子

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循環做到這一點。

感謝

回答

10

好了,我想到的最簡單的一個:

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

這不使用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將相當於由一個乘法不會改變結果。

編輯2:這個編輯正是holi-java剛剛發佈的內容。

1

如果我如此大膽地不做它在一個for循環,

這是一個方便的一個襯墊遞歸函數來確定階乘:

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

還有另一個表現例如:

fun factorial(n: Int) = (2..n).fold(1L, Long::times) 
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") 
}