¿Qué es la recursividad?
Frecuentemente cuando hablamos de la recursividad pareciera que estamos tocando un tema complejo con el cual los estudiantes tienen bastante renuencia.
Para simplificar el tema de la recursividad vamos a empezar definiendo a la recursividad como otra forma de solucionar problemas. Al escribir algoritmos podemos utilizar la forma iterativa o la recursiva, una echa mano de los ciclos (loops) y la otra de invocar a la misma función (recursividad).
Cuando hablamos de recursividad, hablamos de un proceso (una función en nuestro caso) que se llama a si misma.
¿Por qué debería utilizar la recursividad?
La recursividad es muy importante porque es la solución utilizada en muchos de los problemas de programación.
¿Qué es el call stack (pila de llamadas)?
En muchos lenguajes de programación, hay una estructura de datos incorporada llamada call stack (pila de llamadas) que se encarga de determinar que sucede cuando las funciones son invocadas.
Cuando una función es llamada, dicha función es puesta en la parte superior (final) de la pila de llamadas. Cuando encontramos una instrucción return o cuando la función finaliza, el compilador ejecuta la instrucción pop para remover de la pila la última instrucción.
¿Cómo operan las funciones recursivas?
Una función recursiva se invoca a si misma con diferentes valores de entrada, hasta que se cumple una condición que retorna un valor o hace que la función finalice.
Las dos partes esenciales de una función recursiva son:
- La condición base
- Valores cambiantes
function sumar(numero) {
// condición base
if (numero === 1) {
return numero;
}
// valor de entrada cambiante
return numero + sumar(numero - 1);
}
Cálculo del factorial de un número
La siguiente función realiza el cálculo factorial de un número utilizando la forma recursiva.
function factorial(num) {
let total = 1;
for (let i = num; i > 1; i--) {
total = total * i;
}
return total;
}
El equivalente de la función del calculo factorial utilizando la recursividad es el siguiente.
function factorial(numero) {
if (numero > 1) {
return numero * factorial(numero - 1);
}
return numero;
}