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.