Calculer Factorial en Java

Calculer Factorial en Java

1. Vue d'ensemble

Étant donné un entier non négatifn, factorielle est le produit de tous les entiers positifs inférieurs ou égaux àn.

Dans ce rapide didacticiel, nous allons explorerdifferent ways to calculate factorial for a given number in Java.

2. Factorielle pour les nombres jusqu'à 20

2.1. Factorielle utilisant une bouclefor

Voyons un algorithme factoriel de base utilisant une bouclefor:

public long factorialUsingForLoop(int n) {
    long fact = 1;
    for (int i = 2; i <= n; i++) {
        fact = fact * i;
    }
    return fact;
}

La solution ci-dessus fonctionnerafine for numbers up to 20. Mais, si nous essayons quelque chose de plus grand que 20, cela échouera carresults would be too large to be fit into a long, provoquant un débordement.

Voyons un peu plus, notant que chacun desthese will only work for small numbers.

2.2. Factorial utilisant Java 8 Streams

Nous pouvons également utiliser lesJava 8 Stream API pour calculer les factorielles assez facilement:

public long factorialUsingStreams(int n) {
    return LongStream.rangeClosed(1, n)
        .reduce(1, (long x, long y) -> x * y);
}

Dans ce programme, nous utilisons d'abordLongStream pour parcourir les nombres entre 1 etn. Nous avons ensuite utiliséreduce(), qui utilise une valeur d'identité et une fonction d'accumulation pour l'étape de réduction.

2.3. Factorial utilisant la récursion

Et voyons un autre exemple de programme factoriel, cette fois utilisant la récursivité:

public long factorialUsingRecursion(int n) {
    if (n <= 2) {
        return n;
    }
    return n * factorialUsingRecursion(n - 1);
}

2.4. Factorial utilisant Apache Commons Math

Apache Commons Math a une classeCombinatoricsUtils avec une méthode statiquefactorial que nous pouvons utiliser pour calculer la factorielle.

Pour inclure Apache Commons Math, nous allons ajouterthe commons-math3 dependency dans nospom:


    org.apache.commons
    commons-math3
    3.6.1

Voyons un exemple utilisant la classeCombinatoricsUtils :

public long factorialUsingApacheCommons(int n) {
    return CombinatoricsUtils.factorial(n);
}

Notez que son type de retour estlong, tout comme nos solutions maison.

Cela signifie ici que si la valeur calculée dépasseLong.MAX_VALUE, unMathArithmeticException est lancé.

Pour devenir plus grand,we are going to need a different return type.

3. Factoriel pour les nombres supérieurs à 20

3.1. Factorielle utilisantBigInteger

Comme indiqué précédemment, le type de donnéeslong peut être utilisé pour les factorielles uniquement pourn ⇐ 20.

Pour des valeurs plus élevées den,we can use the BigInteger class du packagejava.math, qui peut contenirvalues up to 2^Integer.MAX_VALUE:

public BigInteger factorialHavingLargeResult(int n) {
    BigInteger result = BigInteger.ONE;
    for (int i = 2; i <= n; i++)
        result = result.multiply(BigInteger.valueOf(i));
    return result;
}

3.2. Factorielle utilisant la goyave

La bibliothèqueGuava de Google fournit également une méthode utilitaire pour calculer les factorielles pour de plus grands nombres.

Pour inclure la bibliothèque, nous pouvons ajouter sesthe guava dependency à nospom:


    com.google.guava
    guava
    25.1-jre

Maintenant, nous pouvons utiliser la méthode statiquefactorial de la classeBigIntegerMath pour calculer la factorielle d'un nombre donné:

public BigInteger factorialUsingGuava(int n) {
    return BigIntegerMath.factorial(n);
}

4. Conclusion

Dans cet article, nous avons vu quelques façons de calculer des factorielles en utilisant le noyau Java ainsi que quelques bibliothèques externes.

Nous avons d'abord vu des solutions utilisant le type de donnéeslong pour calculer les factorielles de nombres jusqu'à20. Ensuite, nous avons vu quelques façons d'utiliserBigInteger  pour des nombres supérieurs à 20.

Le code présenté dans cet article est disponibleover on Github.