Está en la página 1de 18

Esquemas Recursivos

No Final y Múltiple
Análisis y Diseño de Datos y Algoritmos
Estructuras de Datos y Algoritmos
ESCUELA TÉCNICA SUPERIOR DE
INGENIERÍA INFORMÁTICA
Departamento de Lenguajes y Sistemas Informáticos
Curso 2021-2022
Índice
▪ Elementos de los algoritmos recursivos

▪ Esquema recursivo no final y algoritmos iterativos

▪ Esquemas recursivos múltiples

▪ Diseño de algoritmos recursivos

2
Elementos recursivos

Análisis y Diseño de Algoritmos 3


Recursividad no final
Esquema general:

No hay algoritmo iterativo directamente equivalente, pero a veces se


puede buscar uno.
Análisis y Diseño de Algoritmos 4
Recursividad no final
Ejemplo: dada una lista, obtener su inversa

Análisis y Diseño de Algoritmos 5


Recursividad no final
Ejemplo: comprobar si una lista está ordenada

Análisis y Diseño de Algoritmos 6


Recursividad no final
Ejemplo: comprobar si una lista está ordenada

Análisis y Diseño de Algoritmos 7


Recursividad no final
Ejemplo: comprobar si una lista está ordenada

Análisis y Diseño de Algoritmos 8


Elementos recursivos

Análisis y Diseño de Algoritmos 9


Esquema recursivo multiple
Esquema general de un algoritmo recursivo mútiple:

b(x) → es caso base?

sb(x) → solución del caso base

y1, y2, … → subproblemas

sp1(x), sp2(x), … → cálculo de los


subproblemas

s1, s2, … → soluciones de los


subproblemas

c(s1, s2, …, x) → función de combinación


(soluciones de los subproblemas +
propiedades del problema)

Análisis y Diseño de Algoritmos 10


Esquema con memoria
Recursividad con memoria:
para evitar cálculos cuando
hay muchos subproblemas
repetidos

Necesitamos un diccionario
(m) que almacene la solución
s para cada problema x ya
resuelto

P es el tipo de los problemas y S


es el tipo de la solución

Análisis y Diseño de Algoritmos 11


Fibonacci sin memoria
static public BigInteger fib(Integer n) {
BigInteger r = null;
if (n==0) {
r = BigInteger.ZERO;
} else if (n==1) {
r = BigInteger.ONE;
} else {
r = fib(n-1).add(fib(n-2));
}
return r;
}

Análisis y Diseño de Algoritmos 12


Fibonacci con memoria
static public BigInteger fib(Integer n) {
return fib(n, new HashMap<>());
}
static public BigInteger fib(Integer n, Map<Integer,BigInteger> m) {
BigInteger r = null;
if (m.contains(n)) {
r = m.get(m);
} else if (n==0) {
r = BigInteger.ZERO;
m.put(n,r);
} else if (n==1) {
r = BigInteger.ONE;
m.put(n,r);
} else {
r = fib(n-1,m).add(fib(n-2,m));
m.put(n,r);
}
Análisis y Diseño de Algoritmos 13
return r;
Trasformación recursivo
múltiple a iterativo

e=(i, u, v) ei=(0,d1,d0)

I: (i,u,v)=(i,fb(i+1),fb(i))

(i+1,u',v')=(i+1,fb(i+2),f(i+1))
=(i+1,a*fb(i+1)+b*fb(i),f(i+1))
=(i+1,a*u+b*v, v)

Fin: i=n-1 => ef=(n-1,fb(n),f(n-1))

14
Trasformación recursivo
múltiple a iterativo
e=(i,u,v) ei=(0,d1,d0)
I: (i,u,v)=(i,fb(i+1),fb(i))

(i+1,u',v')=(i+1,fb(i+2),f(i+1))
=(i+1,a*fb(i+1)+b*fb(i),f(i+1))
=(i+1,a*u+b*v, v)

fin: i=n-1 => ef=(n-1,fb(n),f(n-1))

15
Diseño de alg. recursivos
Opción 1: Partir de una definición o propiedades recursivas → definir
tamaño del problema y casos base → encontrar algoritmo

Opción 2: Generalizar el problema (añadir propiedades) → definir


tamaño y casos base → reducir cada problema a subproblemas más
pequeños → definir la solución en base a la solución de los
subproblemas

Ejemplo 1: Diseñar un algoritmo basado en estas propiedades

16
Diseño de alg. recursivos
Opción 1: Partir de una definición o propiedades recursivas → definir
tamaño del problema y casos base → encontrar algoritmo

Opción 2: Generalizar el problema (añadir propiedades) → definir


tamaño y casos base → reducir cada problema a subproblemas más
pequeños → definir la solución en base a la solución de los
subproblemas

Ejemplo 2: Diseñar un algoritmo para encontrar el elemento


más cercano a otro en una lista ordenada.

17
Esquemas Recursivos
No Final y Múltiple
Análisis y Diseño de Datos y Algoritmos
Estructura de Datos y Algoritmos
ESCUELA TÉCNICA SUPERIOR DE
INGENIERÍA INFORMÁTICA
Departamento de Lenguajes y Sistemas Informáticos
Curso 2021-2022

También podría gustarte