Abrir el simulador
Potencia, factorial, MCD, Fibonacci y suma de un vector: pila y árbol de llamadas, y su versión iterativa.
Lo que vas a aprender
- Las partes de un diseño recursivo: caso base, caso general y combinación.
- Las fases de descenso y ascenso.
- La pila de llamadas y el árbol de llamadas.
- Los tipos de recursión: lineal, final y múltiple.
- Cómo transformar una función recursiva en iterativa.
Cómo se usa el simulador
- Elige la función: potencia, factorial, semifactorial, MCD, Fibonacci o suma de un vector.
- Elige la versión recursiva o iterativa.
- Ajusta los parámetros y avanza con ⏮, ◀, ▶ Ejecutar, ▶ y ⏭.
- Se ven el código con la línea actual y la fase (descenso o ascenso), la pila de llamadas, el árbol de llamadas (en ejecución, en espera o terminadas) y los contadores de llamadas y tamaño máximo de la pila.
Fundamentos teóricos
Diseño recursivo
- Caso base: un caso tan sencillo que se resuelve directamente.
- Caso general: reduce el problema a uno más pequeño del mismo tipo.
- Combinación: construye el resultado a partir del de la llamada.
Descenso y ascenso
- Descenso: se van apilando llamadas, cada una esperando a la siguiente, hasta el caso base.
- Ascenso: cada llamada recibe el resultado de la siguiente, aplica la combinación y devuelve el suyo.
Tipos de recursión
Coste
- Lineal: llamadas y pila de profundidad .
- Fibonacci recursivo ingenuo: el número de llamadas crece exponencialmente (), porque recalcula muchas veces los mismos valores.
De recursiva a iterativa
- Recursión final: basta un bucle que actualice los parámetros.
- No final: un bucle de descenso hasta el caso base y otro de ascenso que aplica la combinación (o calcular directamente de abajo arriba).
Ejemplos resueltos
Ejemplo 1 · potencia(2, 3)
Ejemplo 1 · potencia(2, 3)
Descenso: potencia(2, 3) → (2, 2) → (2, 1) → (2, 0). Caso base: 1.Ascenso: ; ; . 4 llamadas, pila máxima de 4 marcos.
Ejemplo 2 · Factorial
Ejemplo 2 · Factorial
, con caso base .
Ejemplo 3 · Fibonacci
Ejemplo 3 · Fibonacci
fib(5) con y casos base fib(0) = 0, fib(1) = 1 hace 15 llamadas: fib(3) se calcula dos veces y fib(2), tres.
Ejemplo 4 · MCD
Ejemplo 4 · MCD
mcd(84, 60) → mcd(60, 24) → mcd(24, 12) → mcd(12, 0) = 12. Como es final, el resultado sube sin operar.
Experimenta con el simulador
1
La pila
Con potencia, sube n y mira el tamaño máximo de la pila.
2
Fibonacci
Con Fibonacci, pasa de n = 4 a n = 8. ¿Cuánto crece el número de llamadas?
3
Iterativa
Cambia a la versión iterativa del factorial y compara.
Errores frecuentes
- Olvidar el caso base o que el caso general no se acerque a él: desbordamiento de pila.
- Usar Fibonacci recursivo para valores grandes.
- Confundir recursión final con no final.
Herramientas relacionadas
Divide y vencerás
Recursión que parte el problema.
Backtracking
Recursión que explora.
Memoria y punteros
La pila por dentro.