javascript

Factorial de un número en JavaScript con recursividad y ciclos

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.

Algoritmo para calcular factorial en JavaScript

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.