Está en la página 1de 11

Recursividad

<<
Recursividad
Concepto
La recursividad es una técnica de programación muy potente
y puede ser usada en lugar de la iteración.
Es un recurso que reduce la escritura de resolución de los
algoritmos, ocultando detalles de su solución.
Características

1. Condición de fin
Debe tener una condición de fin o paso base, el cual
no se resuelve con recursividad.

2. Paso recursivo
Debe tener una llamada recursiva a sí mismo,
actualizando los parámetros para un caso más
pequeño.
Ejemplo de recursividad

1 si n = 0
N! =
n * (n-1) * (n-2) * … * 1 si n > 0

1 si n = 0
N! =
n * (n-1)! si n > 0

Esta definición es recursiva y la expresamos


en términos de sí misma
Ejemplo de factorial iterativo

function factorial (n: byte): cardinal;


var
fac: cardinal;
i: byte;
cuerpo
fac ← 1
si n > 0 entonces
para i ← n..1
fac ← fac * i
factorial ← fac
fin
Ejemplo de factorial recursivo
factorial(5) en el stack de memoria en
tiempo de ejecución
function factorial (n: byte): cardinal; factorial(0) que es 1

cuerpo 1 * factorial(1 - 1)
si n = 0
2 * factorial(2 - 1)
factorial ← 1
sino 3 * factorial(3 - 1)
factorial ← n * factorial(n-1) 4 * factorial(4 - 1)
fin 5 * factorial(5 - 1)

Stack
Comparación de factorial
iterativo / recursivo
Factorial iterativo Factorial recursivo

function factorial (n: byte): cardinal; function factorial (n: byte): cardinal;
var cuerpo
fac: cardinal; si n = 0
i: byte; factorial ← 1
cuerpo sino
fac ← 1 factorial ← n * factorial(n-1)
si n > 0 entonces fin
para i ← n..1
fac ← fac * i
factorial ← fac
fin
Tres preguntas
1. La pregunta: Caso base
¿Hay una salida no recursiva del procedimiento o función, y
la rutina funciona correctamente para este caso <base>?
2. La pregunta: Llamada más pequeña
La respuesta a esta pregunta debe buscarse en los
parámetros actuales de la nueva llamada recursiva. ¿El valor
nuevo está decrementado y llega en algún momento al valor
de fin?
3. La pregunta: Caso general
¿Se obtiene un resultado correcto a partir de la
"fórmula / acción" empleada?
Ejemplo de error en
llamadas recursivas

Las rutinas recursivas pueden ser confusas a la hora de


depurar, debido al anidamiento de las llamadas a sí misma.
Un ejemplo típico de esto es el STACK OVERFLOW. Se trata
del agotamiento de espacio de la pila en tiempos de
ejecución.
Conclusiones

Ventajas Desventajas

Tiempo

En cuanto a los Espacio


indicadores
Claridad de
modelado
Resolución TP11

Ejercicio 2
Ejercicio 3
Ejercicio 7 (búsqueda binaria)

También podría gustarte