En este post vamos a ver cómo calcular el factorial de un número en JavaScript de dos maneras distintas. Una de ellas es usar un ciclo para calcular el factorial, y la otra es usando la recursividad o recursión.
También veremos el cálculo del factorial de un número usando a BigInt, un nuevo tipo de dato para JavaScript.
Factorial de un número
En términos simples (no soy matemático) el factorial es el resultado de multiplicar un número por todos los números menores a él hasta llegar a 1. Por ejemplo, el factorial de 5 es 120 porque 5 x 4 x 3 x 2 x 1 = 120
, ya que 5 x 4 = 20
, 20 x 3 = 60
, 60 x 2 = 120
y 120 x 1 = 120
.
La cosa se complica un poco cuando son números más grandes, ya que con un poco, se hace mucho. Por ejemplo, el factorial de 50 es 30414093201713378043612608166064768844377641568960512000000000000.
Requisitos y recomendaciones
Aquí usaremos const y funciones flecha en JavaScript, por favor lee los artículos en caso de que no sepas qué son. De esta manera mantenemos el código lo más actual posible, sin perder funcionalidad por ello.
También mira lo que son las template strings en JavaScript, no es obligatorio pero sí recomendado.
Calcular factorial de un número en JavaScript con ciclo while
El código es el siguiente:
/**
* Mi implementación del factorial con el ciclo
* while en el lenguaje de programación JavaScript
*
* @author parzibyte
*/
const factorial = numero => {
if (numero < 0) numero = numero * -1;
if (numero <= 0) return 1;
let factorial = 1;
while (numero > 1) {
factorial = factorial * numero;
numero--;
}
return factorial;
}
for (let x = 0; x < 10; x++) {
console.log(`El factorial de ${x} es ${factorial(x)}`);
}
Mientras el número sea mayor que 1, le vamos restando 1 hasta que se rompa el ciclo. En cada iteración, a la variable factorial
se le va sumando el resultado de multiplicarlo por numero.
Por ejemplo, si numero
es 3, entonces en la primera iteración factorial
es 3, luego numero
es 2 y ahora factorial
es 6. Cuando numero
es 1, se rompe el ciclo.
Al finalizar el ciclo, se regresa la variable factorial
, la cual contiene el factorial del número. Por cierto, antes de ello se hacen comprobaciones como si el número es negativo, 0 o 1.
Factorial de un número en JavaScript con recursión
Ahora veamos el enfoque que usa la recursividad o recursión en JavaScript. Para ello, el código es el siguiente:
const factorial = numero => {
// Sacar valor absoluto
numero = Math.abs(numero);
if (numero <= 1) return 1;
return numero * factorial(numero - 1);
};
for (let x = 0; x < 10; x++) {
console.log(`El factorial de ${x} es ${factorial(x)}`);
}
Si el número es menor o igual a 1, se rompe la recursividad y se regresa 1. Si no, entonces se regresa el resultado de multiplicar el número por el factorial del número -1. De esta manera se va restando el número hasta que el mismo se convierte en 1.
Por cierto, con Math.abs
sacamos el valor absoluto, lo mismo que podríamos haber hecho en el ejemplo anterior, pero preferimos multiplicar por -1.
BigInt y el factorial de un número grande
Gracias a BigInt, se puede calcular el factorial de casi cualquier número, con el tiempo requerido pero pudiendo ser optimizados con los Web Workers de JavaScript.
En fin, si quieres saber cómo sería la implementación del cálculo del factorial con el tipo de dato BigInt en JavaScript aquí está el código:
const factorial = numero => {
if (numero < 0n) numero = numero * -1n;
if (numero <= 0n) return 1n;
let factorial = BigInt(1);
while (numero > 1) {
factorial = factorial * numero;
numero--;
}
return factorial;
}
¿Cuál es mejor?
No sé bien la ventaja de la recursividad, me parece que es más rápida su ejecución. Recomiendo que si vas a calcular el factorial en un escenario real uses el del ciclo while, porque con el de recursividad puedes exceder las llamadas a la pila.
Por cierto, creo que hay algoritmos más rápidos pero a su vez son más difíciles de implementar.
Ejecutar ejemplos
A excepción del ejemplo que usa BigInt
, todos los ejemplos pueden ser ejecutados con Node.Js; recuerda primero instalarlo. Si quieres, descarga el código, guárdalo en un archivo (por ejemplo factorial.js), navega con la terminal hasta donde lo hayas guardado y ejecuta node factorial.js
.
También puedes ejecutar el código en el navegador, poniendo todo en un <script>
o pegando el código directamente en la consola.
Pingback: Factorial iterativo y recursivo en Ruby - Parzibyte's blog