Sunteți pe pagina 1din 25

AD2 98/99.

Tema 2: Anlisis y Diseo de Algoritmos Recursivos


1
Tema 2: Anlisis y Diseo
de Algoritmos Recursivos.
Objetivos.
- Introducir las bases necesarias para el diseo y anlisis de
los algoritmos recursivos.
Bibliografa.
BSICA:
- Brassard, P. Bratley: Algortmica: concepcin y anlisis.
Masson, 1990.
- Scholl P.C. Algortmica y Representacin de Datos. Tomo
2: Recursividad y Arboles. Ed. Masson, 1986.
- Casanova A. Programacin. Servicio de Publicaciones
UPV, Valncia, 1993.
OTROS:
- Aho A.V., Hopcroft J.E., Ullman J.U. The Design and
Analysis of Computer Algorithms. Ed.Addison-Wesley,
1974
- Balczar J.L. Programacin Metdica. McGraw-Hill,
1993
- Grimaldi R.P. Matemticas Discreta y Combinatoria. Ed.
Addison Wesley Iberoamericana, 1984
- Sahni S. Concepts in Discrete Mathematics. The Camelot
Publishing Company, 1985
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
2
Contenidos.
1. INTRODUCCIN : ALGORITMOS RECURSIVOS
2. INDUCCIN
2.1 PRINCIPIO DE INDUCCIN
2.2 VERIFICACIN DE ALGORITMOS RECURSIVOS
3. ETAPAS DEL DISEO RECURSIVO.
4. ANLISIS DE LA COMPLEJIDAD TEMPORAL DE
LOS ALGORITMOS RECURSIVOS
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
3
1. INTRODUCCIN : Algoritmos
recursivos
- Un objeto es recursivo si su definicin requiere la
definicin previa del objeto en un caso ms sencillo.
Ejemplo: Nmeros Naturales N
(a) el 0 es un nmero natural.
(b) el sucesor de un nmero natural es tambin un
nmero natural.
- Una funcin es recursiva si su resolucin requiere la
solucin previa de la funcin para casos ms sencillos.
Ejemplo:
(a) 0!=1
(b) n!=n (n-1)!
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
4
Un algoritmo A que resuelve un problema P es recursivo si
est basado directa o indirectamente en s mismo.
Problema P con Datos I
| |
resuelto
en trminos de ...
| |
Problema P con Datos I' c I
con: I, I' del mismo tipo
I'c I
Cuando I' es lo ms pequea posible, solucin
directa
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
5
ESQUEMA DE UN ALGORITMO RECURSIVO
SENCILLO :
f x
h x d x
c x f ant x d x
( )
( ) ( )
( , ( ( )) ( )
=

{P(x)}
funcin f(x:T1) devuelve T2
opcin
d(x): r:=h(x); /*Casos directos*/
d(x): v:=f(ant(x)); r:=c(x,v);
/*Casos recursivos*/
fopcin
devuelve r
ffuncin
{Q(x,r)}
Cada llamada recursiva (activacin de la funcin) posee su
propio conjunto de variables locales y parmetros.
Existen tantos objetos con un mismo nombre como
activaciones de la funcin estn pendientes de terminar.
La comunicacin entre las sucesivas activaciones debe
hacerse por medio de parmetros.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
6
TIPOS DE RECURSIN
1.- RECURSIN LINEAL : Si cada llamada recursiva
genera, como mucho otra llamada recursiva
- FINAL : si la llamada recursiva es la ltima operacin
que se efecta, devolvindose como resultado lo que se
haya obtenido de la llamada recursiva sin modificacin
alguna.
- NO FINAL : El resultado obtenido de la llamada
recursiva se combina para dar lugar al resultado de la
funcin que realiza la llamada.
2.- RECURSIN MLTIPLE : si alguna llamada puede
generar ms de una llamada adicional.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
7
EJEMPLOS :
- RECURSIN LINEAL FINAL
{n>0 . m>0}
funcin MCD(n,m:entero)devuelve entero
var r :entero ;
opcin
n=m : r :=n ;
n>m : r :=MCD(n-m,m) ;
n<m : r :=MCD(n,m-n) ;
fopcin
devuelve r
ffuncin
{MCD(n,m) es el mximo entero que divide a n y a m}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
8
Supongamos que hacemos la llamada MCD(25,15)
Secuencia de llamadas :
MCD(25,15)
n,m

MCD(n-m,m)
10,15
n,m

MCD(n,m-n)
10,5
n,m

MCD(n-m,m)
5,5
n,m
Traza :
MCD(25,15)
r = MCD(n-m,m)
10,15
n,m
r = MCD(n,m-n)
10,5
n,m
r=MCD(n-m,m)
5,5
n,m
{r=5}
{r=5}
{r=5}
{r=5}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
9
- RECURSIN LINEAL NO FINAL :
{n>0}
funcin FACT (n:entero)devuelve entero
var r,v :entero ;
opcin
n=0 : r :=1 ;
n>0 : v := FACT(n-1) ;
r :=v*n;
fopcin
devuelve r
ffuncin
{FACT(n)=n!}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
10
Supongamos que la llamada inicial es FACT(4)
Secuencia de llamadas :
FACT(4) Llamada inicial
n

FACT(n-1)
3
n

FACT(n-1)
2
n

FACT(n-1)
1
n

FACT(n-1)
0 Caso Directo
n
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
11
Traza :
FACT(4)
n=4
v :=FACT(n-1) ;
n=3
v :=FACT(n-1) ;
n=2
v :=FACT(n-1) ;
n=1
v :=FACT(n-1) ;
n=0
r :=1 ;
{v=1}
r :=v*n
{r=1*1=1}
{v=1}
r :=v*n
{r=1*2=2}
{v=2}
r :=v*n
{r=2*3=6}
{v=6}
r :=v*n
{r=6*4=24}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
12
- RECURSIN MLTIPLE :
{n>0}
funcin Fib(n:entero)devuelve entero ;
var r :entero ;
opcin
ns1 : r:=n ;
n>1 : r:=Fib(n-1)+Fib(n-2) ;
fopcin
devuelve r
ffuncin
{Fib(n)=Fibonacci(n)}
donde Fibonacci n
n n
Fibonacci n Fibonacci n n
( )
( ) ( )
=
s
+ >


`
)
1
1 2 1
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
13
Supongamos que la llamada es Fib(4) :
rbol de llamadas :
Fib(4)
Fib(3) Fib(2)
Fib(2) Fib(1) Fib(1) Fib(0)
Fib(1) Fib(0)
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
14
Traza :
Fib(4) Llamada inicial
n
Fib(n-1)
n=3
Fib(n-1)
n=2
Fib(n-1)
n=1
{r=1}
Fib(n-2)
n=0
{r=0}
{r=1+0=1}
Fib(n-2)
n=1
{r=1}
{r=1+1=2}
Fib(n-2)
n=2
Fib(n-1)
n=1
{r=1}
Fib(n-2)
n=0
{r=0}
{r=1+0=1}
{r=2+1=3}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
15
2. INDUCCIN
Si queremos demostrar la correccin de un algoritmo
recursivo ....
QU MTODO DE DEMOSTRACIN
PODEMOS USAR?
1. Debemos analizar todas y cada una de las
instrucciones del algoritmo.
2. Pero .... !!! incluye instrucciones que consisten en
ejecutar el mismo algoritmo ("llamadas recursivas") !!
Idea : Suponer que estas llamadas funcionan
correctamente e intentar demostrar que la funcin
que hace la llamada tambin.
Aplicar el mtodo de demostracin por induccin
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
16
Para comprobar que un algoritmo recursivo es correcto hay
que analizar los aspectos siguientes :
1.- Hay una salida no recursiva del algoritmo (Caso
Directo) ?, El algoritmo cumple con la especificacin en
este caso ?
2.- Cada llamada recursiva se refiere a un caso ms
pequeo del problema original ?
3.- Suponiendo que la(s) llamada(s) recursivas cumplen la
especificacin (son correctas), cumple la especificacin el
algoritmo completo ?
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
17
2.1 PRINCIPIO DE INDUCCIN.
Principio de Induccin Fuerte
FASE 1: BASE INDUCCIN
Probar que la propiedad P es cierta para n
0
> 0, n
0
e N.
(Para ello se utilizan las propiedades de los naturales.)
FASE 2: INDUCCIN Probar que P es hereditara
2a) HIPTESIS DE INDUCCIN: Supongo P cierta para
n e N / n

> n
0
2b) PRUEBA: Probar que P es cierta para n+1.
(Para ello se utilizan las propiedades de los N y la hiptesis de induccin.)
FASE 3: CONCLUSIN Si hemos concluido con xito las
dos fases anteriores
P es cierta n e N, n > n
0
, n
0
e N
( P(n
0
) . n: ( P(n) P(n + 1) ) ( n: P(n))
n0 n n+1
n0
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
18
Principio de Induccin Fuerte
FASE 1: BASE INDUCCIN
Probar que la propiedad P es cierta para n
0
> 0, n
0
e N.
(Para ello se utilizan las propiedades de los naturales.)
FASE 2: INDUCCIN Probar que P es hereditara
2a) HIPTESIS DE INDUCCIN: Supongo que P es
cierta x e [n
0
, n], n > n
0
, n
0
, n, x e N.
2b) PRUEBA: Probar que P es cierta para n+1.
(Para ello se utilizan las propiedades de los N y la hiptesis de induccin.)
FASE 3: CONCLUSIN Si hemos concluido con xito las
dos fases anteriores
P es cierta n e N, n > n
0
, n
0
e N
( n: (( x: x <n: P(x)) P(n))) ( n: P(n))
x n
n0
n0
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
19
Ejemplo:
Todo nmero de la forma 10
n
-1 es divisible por 9.
BASE DE INDUCCIN:
Probar que 10
0
- 1 es divisible por 9: 10
0
- 1 = 0 = 0
*
9
INDUCCIN:
2a) HIPTESIS DE INDUCCIN:
Supongo que 10
n
- 1 es divisible por 9 ( 10
n
- 1 = 9
*
a)
2b) PRUEBA:
10
n+1
- 1 = 10
*
(10
n
- 1) + 9 = 9
*
(10
*
a + 1)
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
20
PRUEBA POR INDUCCIN DE PROPIEDADES DE
FUNCIONES RECURSIVAS.
Sea f: D R una funcin recursiva.
Sea P una propiedad de la funcin, tal como
CORRECCIN, TERMINACIN, OTRAS
Ejemplo: Dada la funcin factorial
FACT n
n
n FACT n n
( )
* ( )
=
=
>


`
)
1 0
1 0
(a) Demostrar que termina.
Como el dominio de FACT es N, utilizaremos el principio
de induccin sobre N para la demostracin
BASE: FACT(0) origina un nmero finito de clculos
INDUCCIN:
HIPOTESIS: FACT(n - 1) origina un nmero finito de
clculos
PRUEBA: FACT(n) origina un nmero finito?
Por definicin , FACT(n) = FACT(n - 1)
*
n
Por HI, FACT(n - 1) termina
Entonces, FACT(n) tambin termina.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
21
(b) Demostrar que es correcta, o sea que :
FACT n n ( ) ! =
donde n ! se define como n
n
i n
n
! =
=
>

I
1 0
0
1
BASE: FACT(0)=1
INDUCCIN:
HIPTESIS: FACT(n-1) = 1
*
2
*
..
*
(n - 1) n > 0
PRUEBA: FACT(n) = 1
*
2
*
3
*
..
*
n?
Por definicin , FACT(n)=n
*
FACT(n - 1)
Por HI, FACT(n-1) = 1
*
2
*
..
*
(n - 1)
Entonces,
FACT(n) = n
*
(1
*
2
*
..
*
(n - 1))=1
*
2
*
..
*
(n - 1)
*
n
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
22
2.2 VERIFICACIN DE ALGORITMOS
RECURSIVOS. FUNCIN LIMITADORA.
Consideremos el siguiente esquema :
{P(x)}
funcin f(x:T1) devuelve T2
opcin
d(x): r:=h(x); /*Casos directos*/
d(x): v:=f(ant(x)); r:=c(x,v);
/*Casos recursivos*/
fopcin
devuelve r
ffuncin
{Q(x,r)}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
23
Para verificar este esquema consideraremos :
- CASOS DIRECTOS : Tendremos que demostrar
{P(x).d(x)}
r :=h(x)
{Q(x,r)}
que equivale a demostrar P(x).d(x) {Q(x,h(x))}
- CASOS RECURSIVOS :
1.- Garantizar que los parmetros de la llamada recursiva
cumplen la precondicin :
P(x) . d(x) P(ant(x))
2.- Demostracin por induccin de la correccin :
P(x) . d(x) . Q(ant(x),v) Q(x,c(v,x))
H.I
3.- Validacin del razonamiento inductivo :
Definir una funcin limitadora t : T1 Natural
Demostrar que t(x) decrece estrictamente en cada llamada :
P(x) . d(x) t(ant(x)) < t(x)
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
24
La funcin limitadora :
- Valida el razonamiento por induccin
- Garantiza la terminacin de la secuencia de llamadas
recursivas, ya que cada una tiene que tener un valor
natural t(x) estrictamente inferior al de la anterior y en
los Naturales esto no puede ocurrir indefinidamente
- De hecho es una cota superior del nmero de llamadas
que se realizan a la funcin (cuando la recursin es
lineal).
La verificacin no es un argumento a posteriori sino que
guia el diseo y explica el algoritmo.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
25
3. ETAPAS DEL DISEO RECURSIVO.
Un diseo recursivo constar de las siguientes etapas:
1.- Definicin del problema.
2.- Anlisis de casos. Identificacin de la funcin
limitadora.
3.-Transcripcin algortmica y verificacin de cada caso.
4.-Validacin de la induccin : la funcin limitadora
decrece estrictamente en las llamadas.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
26
DEFINICIN DEL PROBLEMA
- Nombre del algoritmo, sus datos y sus resultados
- Precondicin
- Postcondicin
ANLISIS POR CASOS. IDENTIFICACIN DE LA
FUNCIN LIMITADORA.
Analizar los diferentes casos que se puedan presentar,
identificando :
- Uno (o ms) CASOS DIRECTOS
- Uno (o mas) CASOS RECURSIVOS
Concretar la FUNCIN LIMITADORA
OBSERVACIONES :
1.- Es preciso asegurarse de que se cubren todos los casos
que pueden aparecer.
2.- Frecuentemente, la eleccin de los casos directos puede
realizarse antes de decidir la funcin limitadora, basta
comparar P y Q para ver en qu casos es fcil obtener Q a
partir de P. As los casos directos pueden ayudar a buscar la
funcin limitadora : decrementar sta debe suponer
aproximarse al caso directo.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
27
DISEO Y VERIFICACIN DE CADA CASO
Diseo del fragmento de programa que resuelve cada caso
junto con su verificacin :
(1) Al programar los casos recursivos es preciso
suponer, como Hiptesis de Induccin, que las
llamadas recursivas funcionan correctamente.
(2) Para poder aplicar la induccin ha de garantizarse
que, al evaluar la funcin limitadora sobre los
parmetros que aparecen en cada llamada, se obtienen
valores estrictamente menores que los que
corresponden a los recibidos.
Como subproducto de (2) queda demostrado que la
recursin es finita, ya que no puede haber infinitas
llamadas recursivas tales que cada una de ellas tenga
asociado un nmero natural estrictamente inferior al
de la anterior.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
28
PROBLEMA 1: MULTIPLICACIN DE NATURALES
Supongamos que el repertorio de instrucciones disponibles
sobre los naturales se reduce a la suma y la diferencia.
Queremos disear un algoritmo recursivo para realizar la
multiplicacin de naturales.
Definicin :
algoritmo MULT (Datos a,b :entero
Resultado p :entero)
Precondicin {a>0 . b> 0}
Postcondicin {p=a*b}
Anlisis de casos. Funcin limitadora.
Hemos de distinguir al menos un caso directo y otro
recursivo, ste nos ha de permitir hacer decrecer los
parmetros en algn sentido.
Tomemos como funcin limitadora a e intentemos
decrementarla de 1 en 1 :
Caso DIRECTO : a=0
Casos RECURSIVOS : a>0
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
29
Solucin al Caso Directo :
{a=0}
? ? p :=0
{p=a*b}
Solucin a los Casos recursivos :
Obsrvese que a*b=(a-1+1)*b=(a-1)*b+b
{a>0}
p :=MULT(a-1,b)
{p=(a-1)*b)} H.I
? ? p :=p+b
{p=a*b}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
30
El algoritmo queda :
{a>0 . b> 0}
funcin MULT(a,b:entero)devuelve entero;
var p :Natural
opcin
a=0 : p :=0 ;
a>0 : p :=MULT(a-1,b) ;
{p=(a-1)*b}
p :=p+b ;
fopcin
{p=a*b}
devuelve p
ffuncin
{MULT(a,b)=a*b}
Cuntas llamadas recursivas hace MULT(a,b) ? a
PRIMERA MEJORA : Hacer decrecer el menor de a y b
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
31
SEGUNDA MEJORA :
Suponiendo que adems de las operaciones + y - se pueden
usar ciertas multiplicaciones y divisiones (por 2).
Intentemos decrementar a de otra manera : dividiendo por 2
Hemos de garantizar que a div 2 < a (en el caso recursivo):
Caso DIRECTO : a=0
Casos RECURSIVOS : a>0
Solucin al Caso directo : igual que antes
Solucin a los Casos recursivos :
{a>0}
p :=MULT2(a div 2,b)
{p=(a div 2)*b)} H.I
? ?
{p=a*b}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
32
Diseo de ? ?
Si a es PAR : 2*(a div 2)*b=a*b
Si a es impar :
(a div 2)=(a-1) div 2
2*(a div 2)*b=2*((a-1) div 2)*b=(a-1)*b
luego a*b=2*(a div 2)*b+b=MULT2(a div 2,b)+b
Algoritmo resultante :
{a>0 . b> 0}
funcin MULT2(a,b:entero)devuelve entero;
var p :entero
opcin
a=0 : p :=0 ;
a>0 : p :=MULT(adiv2,b);
{p=(a div 2)*b}
opcin
par(a): p:=p*2;
par(a): p:=p*2+b
fopcin
{p=a*b}
devuelve p
ffuncin
{MULT2(a,b)=a*b}
Cuntas llamadas recursivas se realizan en este caso ? log a
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
33
PROBLEMA 2: Clculo del cociente y el resto de la
divisin entera. Dados dos enteros a > 0 y b > 0 se desea
obtener q, r tales que
a = b
*
q + r . q > 0, 0 s r < b
Solo usaremos +, - y multiplicaciones y divisiones por 2.
DEFINICIN:
algoritmo DIVIDIR (Datos a,b :entero
Resultados q,r :entero)
Precondicin {a>0 . b>0}
Postcondicin {a=b*q+r . 0sr<b . q>0}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
34
ANALISIS POR CASOS Y FUNCIN LIMITADORA :
Observemos que :
a - b = b
*
(q - 1) + r, . 0 s r < b . q - 1 > 0
donde q-1 es el cociente de (a-b) div b y r es el resto
Esto nos da una pista para tomar como funcin limitadora a
y reducir su valor en la forma a-b. Esto requiere como
guarda que a>b, quedando a<b como caso directo :
Casos directos : a<b
Casos recursivos : a>b
Solucin de los Casos Directos :
{b>0 .a<b}
? ? q :=0 ; r :=a ;
{a=b*q+r . r<b . q>0}
Solucin de los Casos Recursivos :
{b>0 .a>b}
DIVIDIR(a-b,b,q,r) ;
{a-b=b*q+r} {a=b*(q+1)+r}
q :=q+1 ;
{a=b*q+r . r<b . q>0}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
35
ALGORITMO RESULTANTE :
{a>0 . b>0}
accin dividir(ent a,b:entero;
sal q,r :entero)
opcin
a<b: q :=0;r :=a ;
a>b: dividir(a-b,b,q,r);
q :=q+1 ;
fopcin
ffuncin
{a=b*q+r.q>0.0sr<b. q>0}
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
36
Ejercicios propuestos :
(1) Podramos basar el diseo en reducir a en 1 ?
(2) Disear un algoritmo reduciendo el parmetro a
mediante una divisin por 2.
(3) Disear un algoritmo incrementando el parmetro b
duplicndolo.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
37
PROBLEMA 3 : SUMAR LAS i PRIMERAS
COMPONENTES DE UN VECTOR v.
Supongamos definido :
tipo TipoVector=vector [1..N] de entero ;
DEFINICIN :
algoritmo SUMAV (Datos v :TipoVector ;i :entero
Resultado s : entero)
Precondicin : {0sisN}
Postcondicin : {SUMAV(v)=`
j=1..i
v[j] }
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
38
ANLISIS DE CASOS Y FUNCIN LIMITADORA :
CASO DIRECTO : i=0, anula el dominio del cuantificador
de Q. La solucin es s :=0
CASOS RECURSIVOS : i>0
Como funcin limitadora elegiremos el valor de i
{isN . i>0}
s :=SUMAV(a,i-1) ;
{s=`
j=1..i-1
v[j] }
? ? s :=s+a[i]
{s=`
j=1..i
v[j] }
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
39
Algoritmo resultante :
funcin SumaV(v:TipoVector;i:entero)
devuelve entero
var s :entero ;
opcin
i=0 : s :=0 ;
i>0 : s :=SumaV(v,i-1) ;
s :=s+v[i] ;
fopcin
devuelve s
ffuncin
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
40
4. ANLISIS DE LA COMPLEJIDAD TEMPORAL DE
LOS ALGORITMOS RECURSIVOS.
Si la definicin recursiva es:
f x
h x si d x
c x f ant x f ant x si d x
m
( )
( ) ( )
( , ( ( )),..., ( ( ))) ( )
=

1
el coste del algoritmo asociado vendr frecuentemente
dado por:
coste(n) = m coste( F(n) ) + g(n) si n > n
0
coste (n) = no importa si n s n
0
donde:
- F es la funcin de reduccin de la talla (n) en cada
llamada recursiva. Normalmente F(n)<n, y ms
concretamente: F(n) = nc F(n) = n/c.
- m es el nmero de llamadas recursivas que genera
cada llamada a f(x), suponiendo que en todas ellas la
talla se reduzca de la misma forma.
- g(n) es el coste de f(x) excluidas las llamadas
recursivas.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
41
Resolveremos las relaciones de recurrencia por el
mtodo de sustitucin.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
42
EJEMPLO (Aplicacin del mtodo de sustitucin).
funcin mximo(a: vector; i: entero)
devuelve entero;
opcin
i=1: devuelve a[1];
i>1: devuelve
mayor(mximo(a,i-1),a[i]));
fopcin
ffuncin
La primera llamada es mximo(a,n), siendo n el n
de elementos del vector.
La talla del problema es n.
No hay diferentes instancias; en cualquier caso
se recorre todo el vector.
Las relaciones de recurrencia sern:
coste( 1 ) = K
1
coste( n ) = coste( n-1 ) + K
2
n>1.
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
43
El mtodo de sustitucin consiste en ir desarrollando la
funcin, tomando valores decrecientes de n y
sustituyendo en coste(n) hasta llegar al caso en que
cesa la recurrencia (caso directo).
En el ejemplo anterior:
coste(1) = K
1
coste(n) = coste(n-1) + K
2
n>1,
luego
coste(n)
= coste(n-1) + k
= coste(n-2) + 2k
= coste(n-3) + 3k
= coste(n-4) + 4k = ....
= coste(n-(n-1)) + (n-1)k
= coste(1) + (n-1)k
= k' + (n-1)k e O(n).
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
44
Para obtener el orden de las relaciones ms
habituales, se puede aplicar el siguiente teorema.
TEOREMA. Sean a > 1, b e R
+
, n, c e N.
Supngase que f verifica para n > c las relaciones
indicadas. Entonces:
Caso 1
f(n) = a f(n-c) + b a = 1 O(n)
a > 1 O(a
n/c
)
Caso 2
f(n) = a f(n-c) + bn + d a = 1 O(n
2
)
a > 1 O(a
n/c
)
Caso 3
f(n) = a f(n/c) + b a = 1 O(log
c
n)
a > 1 O(n
log
c
a
)
Caso 4
f(n) = a f(n/c) + bn + d a < c O(n)
a = c O(n log
c
n)
a > c O(n
log
c
a
)
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
45
Ejemplo: Las torres de Hanoi, en el que se deben
mover n discos de uno en uno desde una pila inicial a
otra destino haciendo uso de una tercera pila auxiliar,
con la restriccin de que cualquier disco, en cualquier
momento, slo puede tener por debajo de l discos de
mayor dimetro.
Procedimiento hanoi(n: natural;
ini, dest, aux:
pila de discos) es
si n>0 entonces
hanoi(n-1,ini,aux,dest);
mueve_disco_sup(ini,dest);
hanoi(n-1,aux,dest,ini)
fsi
fprocedimiento,
donde mueve_disco_sup(a,b) tiene coste O(1).
Talla del problema: n. No hay instancias diferentes.
Relaciones de recurrencia de la funcin de coste:
coste(n) = 2 coste(n-1) + K
1
n>0
coste(n) = K
2
n=0
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
46
Al resolver por sustitucin:
coste(n) = 2 coste(n-1) + K
1
n>0
coste(n) = K
2
n=0
coste(n)
= 2coste(n-1) + K
1
= 2(2coste(n-2) + K
1
) + K
1
= 4coste(n-2) +2 K
1
+ K
1
= 4(2coste(n-3) + K
1
) + 2 K
1
+ K
1
= 8coste(n-3) + 4 K
1
+ 2 K
1
+ K
1
=......
= 2
n
coste(0) +2
n-1
K
1
+ 2
n-2
K
1
+ ... + 2 K
1
+ K
1
= 2
n
K
2
+ K
1
(2
n
-1) e O(2
n
).
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
47
EJEMPLO: Bsqueda dicotmica. (Aplicacin de las
relaciones de recurrencia a algoritmos iterativos.)
{ v est ordenado }
procedimiento dicotmica
(v: vector|1..n|
de entero;
n, x: entero;
sal est: lgico;
sal m: entero) es
var i,j: entero fvar;
i:=1 ; j:=n; est := falso;
repetir
m := (i+j) div 2;
opcin
v[m] > x: j := m - 1;
v[m] < x: i := m + 1;
v[m] = x: est := verdadero;
fopcin
hasta que i>j v est
fprocedimiento
{1mn((est vJm7=x) .
(est (k:1kn:vJk7=x)}
La talla del problema es n = j-i+1 = j-i
Caso peor (x no est en v): como tras cada iteracin la
talla del problema disminuye aproximadamente a la
mitad, se tiene que:
coste(n) = K
1
+ coste(n/2) n>1
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
48
(Caso peor)
coste
p
(n) = K
1
+ coste
p(
n/2)) n>1
coste
p
(1) = K
2
Si se resuelve la recurrencia por sustitucin:
coste
p
(n)
= K
1
+ coste
p
(n/2)
= K
1
+ K
1
+ coste
p
(n/2
2
)
= 2 K
1
+ coste
p
(n/2
2
)
= 2 K
1
+ K
1
+ coste
p
(n/2
3
)
= 3 K
1
+ K
1
+ coste
p
(n/2
4
) = ....
= (log
2
n) K
1
+ coste
p
(n/2
log n
))
= (log
2
n) K
1
+ coste
p
(n/n)
= (log
2
n) K
1
+ K
2
e O( logn ).
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
49
Caso mejor: x se encuentra en la primera iteracin.
Resumen:
coste(n) e O( logn )
coste(n) e O( 1 )
AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos
50

S-ar putea să vă placă și