1. Información general
Dado un número entero no negativo n , factorial es el producto de todos los números enteros positivos menores o iguales an .
En este tutorial rápido, exploraremos diferentes formas de calcular factorial para un número dado en Java .
2. Factorial para números hasta 20
2.1. Factorial usando un bucle for
Veamos un algoritmo factorial básico usando un bucle for :
public long factorialUsingForLoop(int n) { long fact = 1; for (int i = 2; i <= n; i++) { fact = fact * i; } return fact; }
La solución anterior funcionará bien para números hasta 20 . Pero, si intentamos algo mayor que 20, fallará porque los resultados serían demasiado grandes para encajar en un largo , provocando un desbordamiento.
Veamos algunos más, señalando que cada uno de estos solo funcionará para números pequeños.
2.2. Factorial usando secuencias de Java 8
También podemos usar la API de Java 8 Stream para calcular factoriales con bastante facilidad:
public long factorialUsingStreams(int n) { return LongStream.rangeClosed(1, n) .reduce(1, (long x, long y) -> x * y); }
En este programa, primero usamos LongStream para iterar a través de los números entre 1 y n . Luego usamos reduce () , que usa un valor de identidad y una función de acumulador para el paso de reducción.
2.3. Factorial usando recursividad
Y veamos otro ejemplo de un programa factorial, esta vez usando recursividad:
public long factorialUsingRecursion(int n) { if (n <= 2) { return n; } return n * factorialUsingRecursion(n - 1); }
2.4. Factorial usando Apache Commons Math
Apache Commons Math tiene una clase CombinatoricsUtils con un método factorial estático que podemos usar para calcular el factorial.
Para incluir Apache Commons Math, agregaremos la dependencia commons-math3 en nuestro pom :
org.apache.commons commons-math3 3.6.1
Veamos un ejemplo usando la clase CombinatoricsUtils :
public long factorialUsingApacheCommons(int n) { return CombinatoricsUtils.factorial(n); }
Tenga en cuenta que su tipo de retorno es largo , al igual que nuestras soluciones locales.
Eso significa aquí que si el valor calculado excede Long.MAX_VALUE , se lanza una MathArithmeticException .
Para hacernos más grandes, necesitaremos un tipo de retorno diferente.
3. Factorial para números superiores a 20
3.1. Factorial usando BigInteger
Como se discutió anteriormente, el tipo de datos largo se puede usar para factoriales solo para n <= 20 .
Para valores más grandes de n , podemos usar la clase BigInteger del paquete java.math , que puede contener valores de hasta 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. Factorial usando guayaba
La biblioteca Guava de Google también proporciona un método de utilidad para calcular factoriales para números más grandes.
Para incluir la biblioteca, podemos agregar su dependencia de guayaba a nuestro pom :
com.google.guava guava 25.1-jre
Ahora, podemos usar el método factorial estático de la clase BigIntegerMath para calcular el factorial de un número dado:
public BigInteger factorialUsingGuava(int n) { return BigIntegerMath.factorial(n); }
4. Conclusión
En este artículo, vimos algunas formas de calcular factoriales utilizando el núcleo de Java, así como un par de bibliotecas externas.
Primero vimos soluciones usando el tipo de datos largo para calcular factoriales de números hasta 20 . Luego, vimos un par de formas de usar BigInteger para números mayores que 20.
El código presentado en este artículo está disponible en Github.