2017-07-19 4 views
3

Mit Erfahrung der Java-Programmierung begann ich Kotlin heute zu lernen. Ich spiele mit der Sprache und fand mich fest, um eine Fakultät mit for Loop in Kotlin zu finden. Ich habe es geschafft, dies mit while Schleife zu tun.Faktor mit `for` Schleife in Kotlin

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 
} 

Bitte mir helfen, dies zu tun, um eine for Schleife.

Dank

Antwort

10

Nun, die einfachste, die in den Sinn kommt:

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

diese kürzer, funktionaler auch Sie können diese nicht verwendet eine for-Schleife, sondern nur als Ergänzung und Kotlin artige reduce mit:

fun factorial(num: Int) = (1..num).reduce(Int::times) 

Oder:

fun factorial(num: Int) = (1..num).reduce { a, b -> a * b } 

Das ist das einfachste was ich mir vorstellen kann.

Edit: Dies entspricht

fun factorial(num: Int) = (2..num).fold(1, Int::times) 

als reduce ist praktisch ein fold vom Wert bei Index 0.

Wir mit 2 anstelle Start Start wäre jedoch 1 Äquivalent wie Multiplikation mit einem ändert das Ergebnis nicht.

Edit 2: Diese Änderung ist genau das, was holi-java gerade gepostet hat.

1

Wenn ich so fett es nicht für Schleife in eine tun,

Hier ist eine handliche rekursive Funktion einzeiler die Fakultät zu bestimmen:

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

es eine andere ist ausdruck B. indem Range#fold und der Funktionsreferenzausdruck verwendet werden, zum Beispiel:

0

Factorial:

fun factorial(num : Long) : Long { 
    var factorial : Long = 1 
    for (i in 2..num) { 
     factorial *= i 
    } 
    println("Factorial of $num = $factorial") 
} 

Factorial Verwendung BigInteger Variable:

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