Está en la página 1de 27

Complejidad algoritmos recursivos

Ing. Carlos Henríquez


Autónoma del Caribe
Que es recursividad?
 Es una técnica de programación que consiste en que un
algoritmo, método, función puede resolver un problema
realizando llamadas así mismo.
Como así?
 Suponga que Ud. va a llenar un tanque de agua capacidad M
para su casa. El agua esta en un pozo a 500 metros de
distancia y solo tiene un balde de capacidad P.
Que hace?
 Pues toma el balde va al pozo, toma el agua, se devuelve y
vierte el agua el tanque. Cuando acaba?. Cuantos viajes hizo?
Solución algorítmica
llenar_tanque()
• Esta solución conocida por
Lea M
Viaj=0
muchos es la solución
mq(x<M) algorítmica iterativa.
lea P • Utilice ciclos (para, mq,hh)
x=x+P para resolver problemas que
viaj++ requieren repetición.
Fmq
Escriba viaj

FIN
Solución recursiva
viaj=0
• Esta solución es llamada:
llenar_tanque(x,M )
algoritmo recursivo.
Si(x>M)
escriba viaj • NO utilizo ciclos para resolver
Sino el problema sino llamadas a si
lea P mismo.
x=x+P
viaj++
llenar_tanque(x,M)
Fsi
FIN
Solución recursiva
viaj=0
• Condiciones:
llenar_tanque(x,M )
– Caso base: condición que
Si(x>M) A
indique que se acabo la
escriba viaj
recursividad (A)
Sino
lea P – Caso recursivo, cuando se hace
la llamada.(B)
x=x+P
viaj++ – Llamada recursiva tiende a caso
llenar_tanque(x,M) (B) base. (Nótese que la x con cada
Fsi llamada se acerca mas a M)
FIN
Recursividad: Cumplir condiciones
 Si no se cumplen las 3 condiciones, muy seguramente se
quedara en un ciclo infinito
 En el ejemplo :
 Si(x>M) : sino está nunca acaba
 llenar_tanque(x,M) : sino hay llamada x
no se acerca a M ciclo infinito.
 x=x+P: si x no aumenta no se acerca a M y
se queda en un ciclo infinito.
Características de la recursividad
 Desventajas
 Todo algoritmo recursivo es ineficiente
en tiempo y espacio porque hace muchas
llamadas.
 A veces realiza llamadas innecesarias
 Ventaja
 Solución a la vista, natural , elegante ,
sencilla y comprensible
Recuerde
 Si existen dos soluciones de un
problema, iterativa y recursiva,
siempre será mejor la iterativa.
 Cuando tenga la única solución
recursiva tómela pero trate de
buscar la iterativa.
Mas ejemplos : Factorial
• Análisis:
– Caso base: si n==1 no
hay llamado recursivo y
termina
– Caso recursivo:
return n*factorial(n-1)
– Llamada recursiva
tiende a caso base.
(Nótese que n va
bajando hasta llegar a 1.
Prueba de escritorio
 fact(5)= 5 * fact(4)
 fact(4)= 4* fact(3)
 fact(3)=3*fact(2)
 fact(2)=2*fact(1)
 fact(1)=1. (caso base)
 Cuando se obtiene el caso base
se empiezan a reemplazar hacia
arriba
Prueba de escritorio
 fact(5)=120
 fact(5)= 5 * 24
 fact(4)= 4* 6=24
 fact(3)=3*2=6
 fact(2)=2*1=2
 fact(1)=1.
Serie de Fibonacci
• Análisis:
– Caso base: si n==0 y
n==1 no hay llamado
recursivo y termina(puede
haber mas de 1 caso base)
– Caso recursivo: return
fibo(n-1) + fibo(n-2);
– Llamada recursiva
tiende a caso base.
(Nótese que n va bajando
hasta llegar a 0 y 1
respectivamente.
Prueba de escritorio
 Fibo(3)=fibo(2)+fibo(1)
 Fibo(2)=fibo(1)+fibo(0)
 Fibo(1)=1 (caso base)
 Fibo(0)=1
 Se reemplaza
 Fibo(2)=1+1
 Fibo(3)=2+1=3
 Fibo(3)=3
Practique y analice
 Factorial (6)=?
 Fibo(5)=?
 Analice mas algoritmos recursivos:
 Torres de hanoi
 Quicksort
 Búsqueda binaria
 Peso de un árbol binario
 Imprimir lista al revés
 Pasar un numero a binario
Calculo de complejidad
 Para calcular el T(n) es necesario analizar el
algoritmo recursivo y obtener una ecuación.
 Esta ecuación se llama : ecuación de recurrencia
E(n)
 Donde T(n)= E(n) y E(n) esta en términos de la
propia T(n)
 Ejemplo de ecuación de recurrencia
 T(n) = T(n-1) +1
Calculo de complejidad
 Cuando se tiene la ecuación de
recurrencia se debe encontrar una
solución.
 Encontrar la solución es encontrar
una expresión no recursiva.
 Ejemplo:
 T(n) =1 + n
Resolver ecuaciones de recurrencia
 Existen tres métodos:
 Suponer una solución f(n) y usar la recurrencia
para demostrar por inducción que t(n)=f(n)
(matemáticas discretas)
 Usar soluciones generales para ciertas
ecuaciones de recurrencia conocidas .
(ecuaciones diferenciales)
 Sustituir las recurrencias por su igualdad hasta
llegar a cierta T(no) conocida.
Sustituir las recurrencias por su
igualdad.
 Utilizamos este método para
calcular complejidad de algoritmo
recursivo.
 Tomemos el algoritmo Factorial y
hallemos la ecuación de
recurrencia.
 En el caso base hay un tiempo en el
que se evalúa n==1 y el retorno.
Este es un tiempo constante c1.
Sustituir las recurrencias por su
igualdad.
 En la otra condición n>1 se tiene
la llamada factorial(n-1) mas el
tiempo de evaluar n>1 mas el
tiempo de multiplicación con n es
un tiempo constante c2.
 De ese análisis tenemos la
ecuación:

 T(n)= c1 si n==1
 T(n)=T(n-1)+c2 si n>1
Sustituir las recurrencias por su
igualdad
 Ahora iniciamos la sustitución con la segunda expresión:
 T(n)= T(n-1)+c2
 T(n-1)=T(n-1-1)+c2=T(n-2)+c2 sustituyo
 T(n)=T(n-2)+c2+c2=t(n-2)+2c2
 T(n-2)=T(n-2-1)+c2=T(n-3)+c2 sustituyo
 T(n)=T(n-3)+c2+2c2=T(n-3)+3c2
 General es T(n)=T(n-k)+kc2
 Si 1=n-k donde T(1)= c1 entonces
 T(n)=c1+(n-1)*c2
 Como ya la ecuación no esta en términos de si misma, la solución es
 Que el O(T(n)) es O(n)
Ejemplo 2
 Se halla la ecuación de
recurrencia
 T(n) = 1 cuando n<=1
 T(n)= 1+T(n/2)
Ejemplo 2
 Ahora hacemos reemplazos
sucesivos
 t(n)= 1+t(n/2)
 t(n/2)=1+t(n/2^2)
 Reemplazo arriba
 t(n)=1+1+t(n/2^2)=2+t(n/2^2)
= k+t(n/2^k)  T(n) = 1 cuando n<=1
 t(n)=k+t(n/2^k)  T(n)= 1+T(n/2)
Ejemplo 2
 Ahora, algo clave. Utilice siempre
lo que tiene que no es recurrente,
es decir t(1)=1
 Entonces n/2^k=1 Se aplica
logaritmo (ver formulas
http://www.ugr.es/~montero/m
atematicas/logaritmos.pdf)
 Queda k= log2(n)  T(n) = 1 cuando n<=1
 Se reemplaza en T(n)  T(n)= 1+T(n/2)
 T(n)= log(n)+t(1)
 Entonces el O(n)= log(n)
Ejemplo 3: Torres de Hanói

La ecuación de recurrencia asociada con el problema de


las Torres de Hanói es la siguiente:

T(n) = 2 T(n-1)+1
Ejemplo 4: Búsqueda binaria

La ecuación de recurrencia asociada con el problema de


las Búsqueda Binaria es la siguiente: