2017-07-19 3 views
3

Avec l'expérience de la programmation java, j'ai commencé à apprendre Kotlin aujourd'hui. Je joue avec la langue et m'a trouvé coincé pour trouver une factorielle en utilisant for boucle dans kotlin. J'ai réussi à le faire en utilisant while boucle.Factoriel utilisant la boucle `for` dans 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 
} 

Veuillez m'aider à le faire en utilisant une boucle for.

Merci

Répondre

10

Eh bien, la plus simple qui vient à l'esprit:

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

Cela n'utilise pas une boucle, mais tout comme un ajout, vous pouvez aussi faire ce court, plus fonctionnel et Kotlin comme l'aide reduce:

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

Ou:

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

C'est le plus simple que je peux penser.

Edit: Cela équivaut à

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

comme reduce est pratiquement fold à partir de la valeur à l'indice 0.

Nous commençons par 2 à la place, mais 1 équivaudrait à multiplier par un ne change pas le résultat.

Édition 2: cette édition est exactement ce que holi-java vient de publier.

1

Si je suis si hardi de ne pas le faire dans une boucle,

Voici une fonction récursive pratique d'une doublure pour déterminer le factoriel:

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

il y a une autre expressive un en utilisant Range#fold et l'expression de référence de fonction, par exemple:

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

factoriel:

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

factoriel en utilisant la variable 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") 
}