Está en la página 1de 25

AD2 98/99.

Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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.

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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

 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

1. INTRODUCCIN : Algoritmos
recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Un algoritmo A que resuelve un problema P es recursivo si


est basado directa o indirectamente en s mismo.

- Un objeto es recursivo si su definicin requiere la


definicin previa del objeto en un caso ms sencillo.
Ejemplo: Nmeros Naturales N
Problema P con Datos I


(a) el 0 es un nmero natural.

resuelto

(b) el sucesor de un nmero natural es tambin un


nmero natural.

en trminos de ...

Problema P con Datos I'  I

- Una funcin es recursiva si su resolucin requiere la


solucin previa de la funcin para casos ms sencillos.
con:

Ejemplo:

I, I' del mismo tipo


I'I

(a) 0!=1

Cuando I' es lo ms pequea posible, solucin


directa

(b) n!=n (n-1)!

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

ESQUEMA DE
SENCILLO :

UN

ALGORITMO

RECURSIVO

h( x )
d ( x)

f ( 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*/

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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.

fopcin
devuelve r
2.- RECURSIN MLTIPLE : si alguna llamada puede
generar ms de una llamada adicional.

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

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

EJEMPLOS :
 RECURSIN LINEAL FINAL

Supongamos que hacemos la llamada MCD(25,15)

Traza :

Secuencia de llamadas :

{n
0 m
0}
funcin MCD(n,m:entero)devuelve entero

MCD(25,15)

var r :entero ;

MCD(25,15)

n,m

opcin

r = MCD(n-m,m)

10,15

n=m :

r :=n ;

n>m :

r :=MCD(n-m,m) ;

MCD(n-m,m)

n<m :

r :=MCD(n,m-n) ;

10,15

fopcin

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

n,m

devuelve r

ffuncin

n,m
r=MCD(n-m,m)

MCD(n,m-n)

{MCD(n,m) es el mximo entero que divide a n y a m}

10,5

5,5

n,m

n,m

{r=5}
{r=5}

MCD(n-m,m)

{r=5}

5,5

{r=5}

n,m

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

 RECURSIN LINEAL NO FINAL :

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Supongamos que la llamada inicial es FACT(4)


Secuencia de llamadas :

{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!}

FACT(4)
n

FACT(n-1)
3
n

FACT(n-1)
2
n

FACT(n-1)
1
n

FACT(n-1)
0
n

Llamada inicial

Caso Directo

10

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Traza :

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

 RECURSIN MLTIPLE :

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}

11

{n
0}
funcin Fib(n:entero)devuelve entero ;
var r :entero ;
opcin
n 1 :

r:=n ;

n>1 : r:=Fib(n-1)+Fib(n-2) ;
fopcin
devuelve r
ffuncin
{Fib(n)=Fibonacci(n)}

donde

n
n 1

Fibonacci (n)  

Fibonacci
(
n
1
)
Fibonacci
(
n
2
)
n



 1

12

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Traza :

Supongamos que la llamada es Fib(4) :


rbol de llamadas :
Fib(4)
Fib(3)
Fib(2)
Fib(1)

Fib(2)

Fib(1)

Fib(0)

13

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Fib(1)

Fib(0)

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}

14

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

2. INDUCCIN
Si queremos demostrar la correccin de un algoritmo

Para comprobar que un algoritmo recursivo es correcto hay


que analizar los aspectos siguientes :

recursivo ....

QU MTODO DE DEMOSTRACIN

1.- Hay una salida no recursiva del algoritmo (Caso


Directo) ?, El algoritmo cumple con la especificacin en
este caso ?

PODEMOS USAR?
1. Debemos analizar todas y cada una de las
instrucciones del algoritmo.

2.- Cada llamada recursiva se refiere a un caso ms


pequeo del problema original ?

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.

3.- Suponiendo que la(s) llamada(s) recursivas cumplen la


especificacin (son correctas), cumple la especificacin el
algoritmo completo ?

 Aplicar el mtodo de demostracin por induccin

15

16

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Principio de Induccin Fuerte

2.1 PRINCIPIO DE INDUCCIN.


Principio de Induccin Fuerte

FASE 1: BASE INDUCCIN

FASE 1: BASE INDUCCIN

Probar que la propiedad P es cierta para n0


0, n0 N.
(Para ello se utilizan las propiedades de los naturales.)

Probar que la propiedad P es cierta para n0


0, n0 N.
(Para ello se utilizan las propiedades de los naturales.)

FASE 2: INDUCCIN

FASE 2: INDUCCIN

2a) HIPTESIS DE INDUCCIN: Supongo que P es


cierta x [n0, n], n
n0, n0, n, x N.

Probar que P es hereditara

2a) HIPTESIS DE INDUCCIN: Supongo P cierta para


n N / n
n0
2b) PRUEBA: Probar que P es cierta para n+1.
(Para ello se utilizan las propiedades de los N y la hiptesis de induccin.)

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 N, n
n0, n0 N

FASE 3: CONCLUSIN Si hemos concluido con xito las


dos fases anteriores
P es cierta n N, n
n0, n0 N
( P(n0) n: ( P(n) P(n + 1) ) n: P(n))

( n: ((x: x <n: P(x)) P(n))) n: P(n))

n0
x

n0

n n+1

Probar que P es hereditara

n0

n0

17

18

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

PRUEBA POR INDUCCIN DE PROPIEDADES DE


FUNCIONES RECURSIVAS.

Ejemplo:
Todo nmero de la forma 10 n -1 es divisible por 9.

Sea f: D R una funcin recursiva.


Sea P una propiedad de la funcin, tal como

BASE DE INDUCCIN:

CORRECCIN, TERMINACIN, OTRAS

Probar que 100 - 1 es divisible por 9: 100 - 1 = 0 = 0 * 9


INDUCCIN:

Ejemplo: Dada la funcin factorial


1
n  0

FACT (n)  

n * FACT (n  1) n  0

2a) HIPTESIS DE INDUCCIN:


(a) Demostrar que termina.
Supongo que 10n - 1 es divisible por 9 ( 10n - 1 = 9 * a)
Como el dominio de FACT es N, utilizaremos el principio
de induccin sobre N para la demostracin

2b) PRUEBA:
10n+1 - 1 = 10 * (10n - 1) + 9 = 9 * (10 * a + 1)

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.

19

20

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

(b) Demostrar que es correcta, o sea que :


FACT (n)  n!

donde n ! se define como

 n1 n  0
n !   i n  0


 1

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

2.2
VERIFICACIN
DE
ALGORITMOS
RECURSIVOS. FUNCIN LIMITADORA.
Consideremos el siguiente esquema :

{P(x)}
funcin f(x:T1) devuelve T2

BASE: FACT(0)=1

opcin
INDUCCIN:
HIPTESIS:

d(x): r:=h(x); /*Casos directos*/


FACT(n-1) = 1 * 2 *.. * (n - 1) n > 0

d(x): v:=f(ant(x)); r:=c(x,v);


/*Casos recursivos*/

PRUEBA: FACT(n) = 1 * 2 * 3 * .. * n?

fopcin
devuelve r

Por definicin , FACT(n)=n * FACT(n - 1)


Por HI, FACT(n-1) = 1 * 2 * .. * (n - 1)

ffuncin
{Q(x,r)}

Entonces,
FACT(n) = n * (1 * 2 * .. *(n - 1))=1 * 2 * .. * (n - 1) * n

21

22

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Para verificar este esquema consideraremos :


 CASOS DIRECTOS : Tendremos que demostrar
{P(x) d(x)}
r :=h(x)
{Q(x,r)}

La funcin limitadora :

- Valida el razonamiento por induccin

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))

- 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).

2.- Demostracin por induccin de la correccin :


P(x)  d(x) Q(ant(x),v)  Q(x,c(v,x))
H.I

La verificacin no es un argumento a posteriori sino que


guia el diseo y explica el algoritmo.

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)

23

24

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

3. ETAPAS DEL DISEO RECURSIVO.


Un diseo recursivo constar de las siguientes etapas:

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

DEFINICIN DEL PROBLEMA


 Nombre

del algoritmo, sus datos y sus resultados

 Precondicin
 Postcondicin

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.

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.

25

26

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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

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

27

28

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Solucin al Caso Directo :

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

El algoritmo queda :
{a
0 b
0}

{a=0}

funcin MULT(a,b:entero)devuelve entero;


??

p :=0

var p :Natural
opcin

{p=a*b}

a=0 : p :=0 ;

Solucin a los Casos recursivos :

a>0 : p :=MULT(a-1,b) ;
{p=(a-1)*b}

Obsrvese que a*b=(a-1+1)*b=(a-1)*b+b

p :=p+b ;
fopcin

{a>0}

{p=a*b}
devuelve p

p :=MULT(a-1,b)

ffuncin
{p=(a-1)*b)} H.I
??

{MULT(a,b)=a*b}


p :=p+b
Cuntas llamadas recursivas hace MULT(a,b) ? a

{p=a*b}

PRIMERA MEJORA : Hacer decrecer el menor de a y b

29

30

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Diseo de ? ?

SEGUNDA MEJORA :

Si a es PAR : 2*(a div 2)*b=a*b


Suponiendo que adems de las operaciones + y - se pueden
usar ciertas multiplicaciones y divisiones (por 2).

Si a es impar :
(a div 2)=(a-1) div 2

Intentemos decrementar a de otra manera : dividiendo por 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

Hemos de garantizar que a div 2 < a (en el caso recursivo):

Algoritmo resultante :
Caso DIRECTO : a=0
{a
0 b
0}

Casos RECURSIVOS : a>0

funcin MULT2(a,b:entero)devuelve entero;

Solucin al Caso directo : igual que antes

var p :entero
opcin

Solucin a los Casos recursivos :

a=0 : p :=0 ;
a>0 : p :=MULT(adiv2,b);

{a>0}

{p=(a div 2)*b}


p :=MULT2(a div 2,b)

opcin

{p=(a div 2)*b)} H.I

par(a):

p:=p*2;

??

par(a):

p:=p*2+b

fopcin

{p=a*b}

{p=a*b}
devuelve p
ffuncin
{MULT2(a,b)=a*b}
Cuntas llamadas recursivas se realizan en este caso ? log a

31

32

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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 r < b
Solo usaremos +, - y multiplicaciones y divisiones por 2.

DEFINICIN:
algoritmo DIVIDIR (Datos a,b :entero
Resultados q,r :entero)

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

ANALISIS POR CASOS Y FUNCIN LIMITADORA :


Observemos que :
a - b = b * (q - 1) + r, 0 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

Precondicin {a
0 b>0}
Postcondicin {a=b*q+r 0 r<b q
0}

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}

33

34

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

ALGORITMO RESULTANTE :

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Ejercicios propuestos :
(1) Podramos basar el diseo en reducir a en 1 ?

{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);

(2) Disear un algoritmo reduciendo el parmetro a


mediante una divisin por 2.
(3) Disear un algoritmo incrementando el parmetro b
duplicndolo.

q :=q+1 ;
fopcin
ffuncin
{a=b*q+r q
0 0 r<b q
0}

35

36

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

PROBLEMA 3 : SUMAR LAS i


COMPONENTES DE UN VECTOR v.

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

PRIMERAS
ANLISIS DE CASOS Y FUNCIN LIMITADORA :
CASO DIRECTO : i=0, anula el dominio del cuantificador
de Q. La solucin es s :=0

Supongamos definido :
tipo TipoVector=vector [1..N] de entero ;

CASOS RECURSIVOS : i>0


DEFINICIN :
Como funcin limitadora elegiremos el valor de i
algoritmo SUMAV (Datos v :TipoVector ;i :entero
Resultado s : entero)

{i N i>0}
s :=SUMAV(a,i-1) ;

Precondicin : {0 i N}
Postcondicin : {SUMAV(v)=j=1..i v[j] }

{s=j=1..i-1 v[j] }
??

{s=j=1..i v[j] }

37

38

s :=s+a[i]

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

4. ANLISIS DE LA COMPLEJIDAD TEMPORAL DE


LOS ALGORITMOS RECURSIVOS.

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

Si la definicin recursiva es:

h( x )
si d ( x )

f (x )  
c( x, f (ant1( x )),..., f (ant m ( x ))) si d ( x )
el coste del algoritmo asociado vendr frecuentemente
dado por:
coste(n) = m coste( F(n) ) + g(n)

si n > n0

coste (n) = no importa

si n n0

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.

39

40

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Resolveremos las relaciones de recurrencia por el


mtodo de sustitucin.

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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 ) = K1
coste( n ) = coste( n-1 ) + K2

41

42

n>1.

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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).

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Para obtener el orden de las relaciones ms


habituales, se puede aplicar el siguiente teorema.
TEOREMA. Sean a
1, b  R+, n, c N.
Supngase que f verifica para n
c las relaciones
indicadas. Entonces:

En el ejemplo anterior:

Caso 1
f(n) = a f(n-c) + b
coste(1) = K1
coste(n) = coste(n-1) + K2
luego

n>1,

a=1

(n)

a>1

(an/c)

a=1

(n2)

a>1

(an/c)

a=1

(logcn)

a>1

(nlogca)

a<c

(n)

a=c

(n logcn)

a>c

(nlogca)

Caso 2
f(n) = a f(n-c) + bn + d

coste(n)
= coste(n-1) + k
= coste(n-2) + 2k
= coste(n-3) + 3k

Caso 3
f(n) = a f(n/c) + b

= coste(n-4) + 4k = ....
= coste(n-(n-1)) + (n-1)k

Caso 4

= coste(1) + (n-1)k

f(n) = a f(n/c) + bn + d

= k' + (n-1)k (n).

43

44

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

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 (1).

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Al resolver por sustitucin:


coste(n) = 2 coste(n-1) + K1

n>0

coste(n) = K2

n=0

coste(n)
= 2coste(n-1) + K1
= 2(2coste(n-2) + K1) + K1
= 4coste(n-2) +2 K1 + K1
= 4(2coste(n-3) + K1) + 2 K1+ K1
= 8coste(n-3) + 4 K1 + 2 K1 + K1 =......
n

n-1

= 2 coste(0) +2
Talla del problema: n. No hay instancias diferentes.

n-2

K1 + 2

= 2 K2 + K1(2 -1)  (2 ).

Relaciones de recurrencia de la funcin de coste:


coste(n) = 2 coste(n-1) + K1

n>0
n=0

coste(n) = K2

45

46

K1 + ... + 2 K1 + K1

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

EJEMPLO: Bsqueda dicotmica. (Aplicacin de las


relaciones de recurrencia a algoritmos iterativos.)

{ v est ordenado }
procedimiento dicotmica
(v: vector1..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
est
fprocedimiento
{1mn((est  vm=x) 
(est  k:1kn:vk x)}

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

(Caso peor)
costep(n) = K1 + costep(n/2))
costep(1) = K2

Si se resuelve la recurrencia por sustitucin:

costep(n)
= K1 + costep(n/2)
2

= K1 + K1 + costep(n/2 )
2

= 2 K1 + costep(n/2 )
3

= 2 K1 + K1 + costep(n/2 )
4

La talla del problema es n = j-i+1


j-i

= 3 K1 + K1 + costep(n/2 ) = ....

Caso peor (x no est en v): como tras cada iteracin la


talla del problema disminuye aproximadamente a la
mitad, se tiene que:

= (log2n) K1 + costep(n/2

coste(n) = K1 + coste(n/2)

47

n>1

n>1

log n

))

= (log2n) K1 + costep(n/n)
= (log2n) K1 + K2 ( logn ).

48

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

AD2 98/99. Tema 2: Anlisis y Diseo de Algoritmos Recursivos

Caso mejor: x se encuentra en la primera iteracin.


Resumen:
coste(n) ( logn )
coste(n) !( 1 )

49

50

También podría gustarte