Calcular fatorial em Java

Calcular fatorial em Java

1. Visão geral

Dado um inteiro não negativon, fatorial é o produto de todos os inteiros positivos menores ou iguais an.

Neste tutorial rápido, exploraremosdifferent ways to calculate factorial for a given number in Java.

2. Fatorial para números até 20

2.1. Fatorial usando um loopfor

Vamos ver um algoritmo fatorial básico usando um loopfor:

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

A solução acima funcionaráfine for numbers up to 20. Mas, se tentarmos algo maior que 20, ele falhará porqueresults would be too large to be fit into a long, causando um estouro.

Vamos ver mais alguns, observando que cada um dosthese will only work for small numbers.

2.2. Fatorial usando Java 8 Streams

Também podemos usarJava 8 Stream API para calcular fatoriais com bastante facilidade:

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

Neste programa, primeiro usamosLongStream para iterar através dos números entre 1 en. Em seguida, usamosreduce(), que usa um valor de identidade e uma função de acumulador para a etapa de redução.

2.3. Fatorial usando Recursão

E vamos ver outro exemplo de programa fatorial, desta vez usando recursão:

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

2.4. Fatorial usando o Apache Commons Math

Apache Commons Math tem uma classeCombinatoricsUtils com um métodofactorial estático que podemos usar para calcular o fatorial.

Para incluir o Apache Commons Math, adicionaremosthe commons-math3 dependency em nossopom:


    org.apache.commons
    commons-math3
    3.6.1

Vejamos um exemplo usando o sclassCombinatoricsUtils :

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

Observe que seu tipo de retorno élong, assim como nossas soluções caseiras.

Isso significa que se o valor calculado excederLong.MAX_VALUE, umMathArithmeticException é lançado.

Para ficar maior,we are going to need a different return type.

3. Fatorial para números maiores que 20

3.1. Fatorial usandoBigInteger

Conforme discutido antes, o tipo de dadoslong pode ser usado para fatoriais apenas paran ⇐ 20.

Para valores maiores den,we can use the BigInteger class do pacotejava.math, que pode contervalues 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. Fatorial usando Goiaba

A bibliotecaGuava do Google também fornece um método utilitário para calcular fatoriais para números maiores.

Para incluir a biblioteca, podemos adicionar seuthe guava dependency ao nossopom:


    com.google.guava
    guava
    25.1-jre

Agora, podemos usar o métodofactorial estático da classeBigIntegerMath para calcular o fatorial de um determinado número:

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

4. Conclusão

Neste artigo, vimos algumas maneiras de calcular fatoriais usando Java principal, bem como algumas bibliotecas externas.

Vimos pela primeira vez soluções usando o tipo de dadoslong para calcular fatoriais de números até20. Então, vimos algumas maneiras de usarBigInteger  para números maiores que 20.

O código apresentado neste artigo está disponívelover on Github.