La recursión nos permite solucionar problemas que se pueden dividir en casos cada vez más simples.
Por ejemplo, el factorial de un número es la multiplicación de los números (positivos) menores a ese número. La notación que se utiliza para representar el factorial es el número seguido de un signo de exclamación (!
). Por ejemplo 5!
es igual a 120
:
5! = 5 * 4 * 3 * 2 * 1 = 120
Sin embargo, 5!
también se podría expresar como:
5! = 5 * 4!
Esto es recursión: solucionamos primero 4!
y después lo multiplicamos por 5
. Pero para solucionar 4!
podemos solucionar primero 3!
y multiplicarlo por 4
. Y para solucionar 3!
podemos solucionar 2!
y multiplicarlo por 3
. Y lo mismo con 2!
: solucionamos 1!
y lo multiplicamos por 2
. El caso base es 1!
que es 1
.
La clave de la recursión es que una función se puede llamar a sí misma como en el siguiente ejemplo que nunca terminaría:
function hola() {
hola();
}
hola();
Cualquier ciclo se puede reescribir de forma recursiva y viceversa. Por ejemplo, podemos imprimir los números del 1 al 10 de forma recursiva:
function printNumber(x) {
console.log(x); // imprime el número
if (x < 10) { printNumber(x + 1); }
}
printNumber(1); // inicia la recursión
La última línea llama el método printNumber
pasándole como parámetro el número 1
. Luego, en la línea 2 imprimimos el número y por último la función se llama a si misma si el número es menor a 10
.
El ejemplo anterior sería mucho más fácil con un ciclo normal:
for (var i=1; i <= 10; i++) {
console.log(x);
}
Algunos problemas se adaptan mejor a ser solucionados por recursión y otros por iteración.
Lo que debes tener en cuenta al crear una función recursiva es lo siguiente:
- Definir los casos triviales, es decir, los casos en los que no se debe volver a invocar la función.
- Definir los casos generales, es decir, los casos en los que sí se debe volver a invocar la función.
- Verificar que los valores que se pasan como argumentos de la función cambien cada vez que se invoca (se deberían acercar a los casos triviales).