Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bibliografa.
BSICA:
Brassard, P. Bratley: Algortmica: concepcin y anlisis.
Masson, 1990.
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
1. INTRODUCCIN : Algoritmos
recursivos
resuelto
en trminos de ...
Problema P con Datos I' I
Ejemplo:
(a) 0!=1
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):
TIPOS DE RECURSIN
fopcin
devuelve r
2.- RECURSIN MLTIPLE : si alguna llamada puede
generar ms de una llamada adicional.
ffuncin
{Q(x,r)}
EJEMPLOS :
RECURSIN LINEAL FINAL
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)
10,5
5,5
n,m
n,m
{r=5}
{r=5}
MCD(n-m,m)
{r=5}
5,5
{r=5}
n,m
{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
Traza :
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
Traza :
Fib(2)
Fib(1)
Fib(0)
13
Fib(1)
Fib(0)
14
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.
15
16
FASE 2: INDUCCIN
FASE 2: INDUCCIN
n0
x
n0
n n+1
n0
n0
17
18
Ejemplo:
Todo nmero de la forma 10 n -1 es divisible por 9.
BASE DE INDUCCIN:
2b) PRUEBA:
10n+1 - 1 = 10 * (10n - 1) + 9 = 9 * (10 * a + 1)
19
20
n1 n 0
n ! i n 0
1
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:
PRUEBA: FACT(n) = 1 * 2 * 3 * .. * n?
fopcin
devuelve r
ffuncin
{Q(x,r)}
Entonces,
FACT(n) = n * (1 * 2 * .. *(n - 1))=1 * 2 * .. * (n - 1) * n
21
22
La funcin limitadora :
23
24
Precondicin
Postcondicin
25
26
27
28
El algoritmo queda :
{a
0 b
0}
{a=0}
p :=0
var p :Natural
opcin
{p=a*b}
a=0 : p :=0 ;
a>0 : p :=MULT(a-1,b) ;
{p=(a-1)*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}
29
30
Diseo de ? ?
SEGUNDA MEJORA :
Si a es impar :
(a div 2)=(a-1) div 2
Algoritmo resultante :
Caso DIRECTO : a=0
{a
0 b
0}
var p :entero
opcin
a=0 : p :=0 ;
a>0 : p :=MULT(adiv2,b);
{a>0}
opcin
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
DEFINICIN:
algoritmo DIVIDIR (Datos a,b :entero
Resultados q,r :entero)
Precondicin {a
0 b>0}
Postcondicin {a=b*q+r 0
r<b q
0}
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
ALGORITMO RESULTANTE :
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);
q :=q+1 ;
fopcin
ffuncin
{a=b*q+rq
00
r<b q
0}
35
36
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 ;
{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]
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
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
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
41
42
n>1.
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
43
44
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
n>0
n=0
coste(n) = K2
45
46
K1 + ... + 2 K1 + K1
{ 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)}
(Caso peor)
costep(n) = K1 + costep(n/2))
costep(1) = K2
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
= 3 K1 + K1 + costep(n/2 ) = ....
= (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
49
50