Documente Academic
Documente Profesional
Documente Cultură
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
T(n) = 2 T(n-1)+1
Ejemplo 4: Búsqueda binaria