[英]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.