No todo es iterar. Cuando la recursividad ataca.

Iterar.

Iterar.Iterar.

Iterar.Iterar.Iterar.

Iterar.Iterar.Iterar.Iterar.


Hay que recordar que usamos la iteración cuando intentamos repetir una instrucción muchas veces sin escribir código una y otra vez.

Algunos ejemplos de estructuras de control iterativas son los ciclos for y ciclos while.

Sin embargo muchos problemas que se resuelven con iteración los podemos fácilmente resolver con recursividad.

¿Por qué?

Porque es elegante. Y si recordaras de artículos pasados. Siempre tienes que escribir código como si quisieras conquistar al amor de tu vida.

Primero definamos que es recursividad. En pocas palabras:

Recursividad es especificar un proceso, basado en su propia definición

La siguiente imagen ayudará a ilustrar mas el concepto.

Como vemos, la muñeca mas grande esta compuesta de otra muñeca casi idéntica (lo único que cambia es el tamaño).

Así podemos que decir que una muñeca está compuesta de otra muñeca.

Ya que tenemos más o menos claro que es recursividad; podemos definir que es una función recursiva:

Una función recursiva, es una función que se llama a si misma.

El simple concepto sería eso:

function contar(){
contar()
}

La función de arriba, por definición nos arroja un error, ya que nunca le estamos diciendo como parar.

Veremos que es el “call stack” mas adelante

Este límite es un pilar fundamental en la recursividad.

Veamos un ejemplo.


Supongamos que queremos hacer una función que cuente del N a 1, donde N es el parámetro de entrada de la función.

Usando iteración, lo hariamos asi:

function contar(hastaNumero){
    for(var i = hastaNumero;i>=1;i--){
        console.log(i)
}
}

Funciona, si.

Pero, ¿Y si queremos enamorar a alguién con nuestro código?

Yo intentaría la recursividad.

Podemos hacer esto:

function contar(n){
    if(n>0){
        console.log(n)
contar(n-1)
}
}
Una solución elegante

Aquí vemos que ya estamos poniendo un límite a la recursividad. “if(n>0)”.


Ahora intentemos programar algo más interesante.

Calcular el factorial de un número.

El factorial de un número, es el producto de la multiplicación de 1 hasta el número.

Por ejemplo, el factorial de 5. (se abrevia en matemáticas como 5!)

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

Ó, el factorial de 4 sería:

4! = 1* 2 * 3 * 4 * = 24

Entonces, ¿Cómo creamos una función que calcule el factorial de un número?

Lo primero que tenemos que hacer, es analizar matemáticamente el problema.

Sabemos que:

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

pero también nos damos cuenta que

1 * 2 * 3 * 4 = 4!

entonces podemos decir que:

5! = 4! * 5

o jugando un poco:

5! = 3! * 4 * 5

Entonces, podemos decir que:

Como podemos ver, el caso más sencillo, que no requiere ningún tipo de recursión, es el factorial de 1. Ese puede ser nuestro límite.

Osea que:

Si n = 1, regresamos 1.

Si no, regresamos n * factorial (n-1).

Algo asi:

function factorial(n){
    if(n == 1){
        return 1    
}
    else{
        return n * factorial(n-1)
}
}

Probablemente te estés preguntando:

¿Todo lo que puedo hacer con recursividad lo puedo hacer con iteraciones?

Si, todo.

¿Es igual de elegante?

No, ni un poquito.

Y no se tú, pero a me gusta tener elegancia aún en las cosas más triviales.

Show your support

Clapping shows how much you appreciated Emmanuel Orozco’s story.