Artículo original escrito por: Sonya Moisset
Artículo original: Three Ways to Factorialize a Number in JavaScript
Traducido y adaptado por: Sil Zubikarai

Este artículo está basado en freeCodeCamp Programación de Algoritmos Básicos "Factoriza un  número".

En matemáticas, el factorial de un entero no negativo n puede ser un algoritmo complicado. En este artículo, voy a explicar tres enfoques, primero con la función recursiva, segundo usando el bucle while y tercero usando el bucle for.

Ya hemos visto el enfoque de recursión en la cadena de texto en el artículo previo, ¿Como invertir una cadena en JavaScript en tres diferentes formas? Esta vez vamos a aplicar el mismo concepto en un número.

Desafío del algoritmo

Devuelve el factorial del entero proporcionado.

Si el entero es representado con la letra n, el producto factorial de todos los enteros positivos menores o iguales a n.

Los factoriales regularmente son representados  con la abreviatura n!

Por ejemplo: 5! = 1 * 2 * 3 * 4 * 5 = 120

function factorialize(num) {
  return num;
}
factorialize(5);

Casos de prueba proporcionados

  • factorialize(0) Debe regresar 1
  • factorialize(5)  Debe regresar 120
  • factorialize(10)  Debe regresar 3628800
  • factorialize(20)  Debe regresar 2432902008176640000

¿De qué se trata factorizar un número?

Cuando tú factorizas un número, tú estás multiplicando ese número por cada  número consecutivo menos uno.

Si tu número es 5, deberías tener:

5! = 5 * 4 * 3 * 2 * 1

El patrón deberá ser:

0! = 1
1! = 1
2! = 2 * 1
3! = 3 * 2 * 1
4! = 4 * 3 * 2 * 1
5! = 5 * 4 * 3 * 2 * 1

1. Factorizar un número con recursión

function factorialize(num) {
  // Si el número es menor que 0, rechacelo. 
  if (num < 0) 
        return -1;
    
  // Si el número es 0, su factorial es 1.
  else if (num == 0) 
      return 1;
    
  // De otra forma, llama al procedimiento de nuevo
    else {
        return (num * factorialize(num - 1));
        /* 
   Primera parte del metodo recursion
        Necesitas recordar que no solo tendras solo una llamada, tendras varias llamadas anidadas.
        
        cada llamada: num === "?"        	         num * factorialize(num - 1)
        1ª llamada – factorialize(5) devolvera    5  * factorialize(5 - 1) // factorialize(4)
        2ª llamada – factorialize(4) devolvera    4  * factorialize(4 - 1) // factorialize(3)
        3ª llamada – factorialize(3) devolvera    3  * factorialize(3 - 1) // factorialize(2)
        4ª llamada – factorialize(2) devolvera    2  * factorialize(2 - 1) // factorialize(1)
        5ª llamada – factorialize(1) devolvera    1  * factorialize(1 - 1) // factorialize(0)
        
         Segunda parte del metodo recursion
     Si el metodo toca la condicion if, y regresa 1 cuando el numero se multiplica asi mismo.
         La funcion regresara con el valor total
        
        5ª la llamada devolvera (5 * (5 - 1))     // num = 5 * 4
        4ª la llamada devolvera (20 * (4 - 1))    // num = 20 * 3
        3ª la llamada devolvera (60 * (3 - 1))    // num = 60 * 2
        2ª la llamada devolvera (120 * (2 - 1))   // num = 120 * 1
        1ª la llamada devolvera (120)             // num = 120
        
        Si sumamonos todas las llamadas en una linea, tenemos
        (5 * (5 - 1) * (4 - 1) * (3 - 1) * (2 - 1)) = 5 * 4 * 3 * 2 * 1 = 120
        */
    }
}
factorialize(5);

Sin comentarios:

function factorialize(num) {
  if (num < 0) 
        return -1;
  else if (num == 0) 
      return 1;
  else {
      return (num * factorialize(num - 1));
  }
}
factorialize(5);

2. Factorizar un número con el bucle WHILE

function factorialize(num) {
  // Paso 1. Crea una variable resultado que guarda num
  var result = num;
   
  // Si num = 0 O num = 1, el factorial devolverá 1
  if (num === 0 || num === 1) 
    return 1; 
 
  // Paso 2. Crea un bucle WHILE
  while (num > 1) { 
    num--; // decrementation by 1 at each iteration
    result = result * num; // or result *= num; 
    /* 
                    num           num--      var result      result *= num         
    1ª iteración:   5             4            5             20 = 5 * 4      
    2ª iteración:   4             3           20             60 = 20 * 3
    3ª iteración:   3             2           60            120 = 60 * 2
    4ª iteración:   2             1          120            120 = 120 * 1
    5ª iteración:   1             0          120
    Fin del bucle WHILE
    */
  }
     
  // Paso 3. Regresa el factorialdel integral dado
  return result; // 120
}
factorialize(5);

Sin comentarios:

function factorialize(num) {
  var result = num;
  if (num === 0 || num === 1) 
    return 1; 
  while (num > 1) { 
    num--;
    result *= num;
  }
  return result;
}
factorialize(5);

3. Factorizar un número con el bucle FOR

function factorialize(num) {
  // Si num = 0 OR num = 1, el factorial regresa 1
  if (num === 0 || num === 1)
    return 1;
  
  // Empezamos el bucle FOR con i = 4
  //Decremento i después de cada iteración
  for (var i = num - 1; i >= 1; i--) {
    //Guardamos el valor de num en cada iteración
    num = num * i; // o num *= i;
    /* 
                    num      var i = num - 1       num *= i         i--       i >= 1?
    1ª iteración:   5           4 = 5 - 1         20 = 5 * 4        3          yes   
    2ª iteración:  20           3 = 4 - 1         60 = 20 * 3       2          yes
    3ª iteración:  60           2 = 3 - 1        120 = 60 * 2       1          yes  
    4ª iteración: 120           1 = 2 - 1        120 = 120 * 1      0          no             
    5ª iteración: 120               0                120
    Fin del bucle FOR 
    */
  }
  return num; //120
}
factorialize(5);

Sin comentarios:

function factorialize(num) {
  if (num === 0 || num === 1)
    return 1;
  for (var i = num - 1; i >= 1; i--) {
    num *= i;
  }
  return num;
}
factorialize(5);

Espero que hayas encontrado esto útil.

Puedes seguirme en Medium, Twitter, Github, y LinkedIn