Objetivos. de Algoritmos Recursivos. Tema 2: Análisis …erodri/tema2.pdfAD2 98/99. Tema 2:...
Transcript of Objetivos. de Algoritmos Recursivos. Tema 2: Análisis …erodri/tema2.pdfAD2 98/99. Tema 2:...
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
1
Tema 2: Análisis y Diseñode Algoritmos Recursivos.
Objetivos.
� Introducir las bases necesarias para el diseño y análisis delos algoritmos recursivos.
Bibliografía.
BÁSICA:� Brassard, P. Bratley: “Algorítmica: concepción y análisis”.
Masson, 1990.
� Scholl P.C. Algorítmica y Representación de Datos. Tomo2: Recursividad y Arboles. Ed. Masson, 1986.
� Casanova A. Programación. Servicio de PublicacionesUPV, València, 1993.
OTROS:� Aho A.V., Hopcroft J.E., Ullman J.U. The Design and
Analysis of Computer Algorithms. Ed.Addison-Wesley,1974
� Balcázar J.L. “Programación Metódica”. McGraw-Hill,1993
� Grimaldi R.P. Matemáticas Discreta y Combinatoria. Ed.Addison Wesley Iberoamericana, 1984
� Sahni S. Concepts in Discrete Mathematics. The CamelotPublishing Company, 1985
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
2
Contenidos.1. INTRODUCCIÓN : ALGORITMOS RECURSIVOS
2. INDUCCIÓN
2.1 PRINCIPIO DE INDUCCIÓN
2.2 VERIFICACIÓN DE ALGORITMOS RECURSIVOS
3. ETAPAS DEL DISEÑO RECURSIVO.
4. ANÁLISIS DE LA COMPLEJIDAD TEMPORAL DELOS ALGORITMOS RECURSIVOS
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
3
1. INTRODUCCIÓN : Algoritmosrecursivos
- Un objeto es recursivo si su definición requiere ladefinición previa del objeto en un caso más sencillo.
Ejemplo: Números Naturales N
(a) el 0 es un número natural.
(b) el sucesor de un número natural es también unnúmero natural.
- Una función es recursiva si su resolución requiere lasolución previa de la función para casos más sencillos.
Ejemplo:
(a) 0!=1
(b) n!=n (n-1)!
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
4
Un algoritmo A que resuelve un problema P es recursivo siestá basado directa o indirectamente en sí mismo.
Problema P con Datos I
���
resuelto
en términos de ...
��������������������������
Problema P con Datos I' �� I
con: I, I' del mismo tipo
I'���I
Cuando I' es lo más pequeña posible, solucióndirecta
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
5
ESQUEMA DE UN ALGORITMO RECURSIVOSENCILLO :
f xh x d x
c x f ant x d x( )
( ) ( )
( , ( ( )) ( )�
���
{P(x)}
función f(x:T1) devuelve T2
opción
d(x): r:=h(x); /*Casos directos*/
�d(x): v:= f(ant(x)) ; r:=c(x,v);
/*Casos recursivos*/
fopción
devuelve r
ffunción
{Q(x,r)}
� Cada llamada recursiva (activación de la función) posee supropio conjunto de variables locales y parámetros.
Existen tantos objetos con un mismo nombre comoactivaciones de la función estén pendientes de terminar.
� La comunicación entre las sucesivas activaciones debehacerse por medio de parámetros.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
6
TIPOS DE RECURSIÓN
1.- RECURSIÓN LINEAL : Si cada llamada recursivagenera, como mucho otra llamada recursiva
- FINAL : si la llamada recursiva es la última operaciónque se efectúa, devolviéndose como resultado lo que sehaya obtenido de la llamada recursiva sin modificaciónalguna.
- NO FINAL : El resultado obtenido de la llamadarecursiva se combina para dar lugar al resultado de lafunción que realiza la llamada.
2.- RECURSIÓN MÚLTIPLE : si alguna llamada puedegenerar más de una llamada adicional.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
7
EJEMPLOS :
� RECURSIÓN LINEAL FINAL
{n0 � m0}
función MCD( n,m :entero)devuelve entero
var r :entero ;
opción
n=m : r :=n ;
n>m : r := MCD( n-m, m) ;
n<m : r := MCD( n, m-n) ;
fopción
devuelve r
ffunción
{MCD(n,m) es el m·ximo entero que divide a n y a m}
AD2 98/99. Tema 2: Análisis y Diseño 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: Análisis y Diseño de Algoritmos Recursivos
9
� RECURSIÓN LINEAL NO FINAL :
{n0}
función FACT ( n:entero)devuelve entero
var r,v :entero ;
opción
n=0 : r :=1 ;
n>0 : v := FACT( n-1 ) ;
r :=v*n;
fopción
devuelve r
ffunción
{FACT(n)=n†!}
AD2 98/99. Tema 2: Análisis y Diseño 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: Análisis y Diseño de Algoritmos Recursivos
11
Traza :
FACT(4) n=4
v :=FACT(n-1) ; n=3v :=FACT(n-1) ;
n=2v :=FACT(n-1) ;
n=1v :=FACT(n-1) ;
n=0r :=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: Análisis y Diseño de Algoritmos Recursivos
12
� RECURSIÓN MÚLTIPLE :
{n0}
función Fib ( n:entero)devuelve entero ;
var r :entero ;
opción
n 1 : r:=n ;
n>1 : r:= Fib ( n-1 )+ Fib ( n-2 ) ;
fopción
devuelve r
ffunción
{Fib(n)=Fibonacci(n)}
donde Fibonacci nn n
Fibonacci n Fibonacci n n( )
( ) ( )�
� � � ���
���
1
1 2 1
AD2 98/99. Tema 2: Análisis y Diseño 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: Análisis y Diseño 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: Análisis y Diseño de Algoritmos Recursivos
15
2. INDUCCIÓN
Si queremos demostrar la correcciÛn de un algoritmo
recursivo ....
øQU… M…TODO DE DEMOSTRACI”N
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 funcionancorrectamente e intentar demostrar que la funciónque hace la llamada también.
� Aplicar el método de demostración por inducción
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
16
Para comprobar que un algoritmo recursivo es correcto hayque analizar los aspectos siguientes :
1.- ¿Hay una salida no recursiva del algoritmo (CasoDirecto) ?, ¿El algoritmo cumple con la especificación eneste caso ?
2.- ¿Cada llamada recursiva se refiere a un caso máspequeño del problema original ?
3.- Suponiendo que la(s) llamada(s) recursivas cumplen laespecificación (son correctas), ¿cumple la especificación elalgoritmo completo ?
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
17
2.1 PRINCIPIO DE INDUCCIÓN.
Principio de Inducción Fuerte
FASE 1: BASE INDUCCIÓN
Probar que la propiedad P es cierta para n0 �0, n0 ��N.(Para ello se utilizan las propiedades de los naturales.)
FASE 2: INDUCCIÓN Probar que P es hereditara
2a) HIPÓTESIS DE INDUCCIÓN: Supongo P cierta paran ��N / n �n0
2b) PRUEBA: Probar que P es cierta para n+1.(Para ello se utilizan las propiedades de los N y la hipótesis de inducción.)
FASE 3: CONCLUSIÓN Si hemos concluido con éxito lasdos fases anteriores
P es cierta ��n ��N, n �n0, n0 ��N
( P(n0) ����n: ( P(n) ��P(n + 1) ) �����n: P(n))
n0 n n+1 n0
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
18
Principio de Inducción Fuerte
FASE 1: BASE INDUCCIÓN
Probar que la propiedad P es cierta para n0 �0, n0 ��N.(Para ello se utilizan las propiedades de los naturales.)
FASE 2: INDUCCIÓN Probar que P es hereditara
2a) HIPÓTESIS DE INDUCCIÓN: Supongo que P escierta ��x ��[n0, n], n �n0, n0, n, x ��N.
2b) PRUEBA: Probar que P es cierta para n+1.(Para ello se utilizan las propiedades de los N y la hipótesis de inducción.)
FASE 3: CONCLUSIÓN Si hemos concluido con éxito lasdos fases anteriores
P es cierta ��n ��N, n �n0, n0 ��N
( ��n: ((��x: x <n: P(x)) ��P(n))) �����n: P(n))
x n
n0
n0
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
19
Ejemplo:
Todo número de la forma 10 n -1 es divisible por 9.
BASE DE INDUCCIÓN:
Probar que 100 - 1 es divisible por 9: 100 - 1 = 0 = 0 * 9
INDUCCIÓN:
2a) HIPÓTESIS DE INDUCCIÓN:
Supongo que 10n - 1 es divisible por 9 ( 10n - 1 = 9 * a)
2b) PRUEBA:
10n+1 - 1 = 10 * (10n - 1) + 9 = 9 * (10 * a + 1)
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
20
PRUEBA POR INDUCCIÓN DE PROPIEDADES DEFUNCIONES RECURSIVAS.
Sea f: D ��R una función recursiva.
Sea P una propiedad de la función, tal como
CORRECCIÓN, TERMINACIÓN, OTRAS
Ejemplo: Dada la función factorial
FACT nn
n FACT n n( )
* ( )�
�
� ���
���
1 0
1 0
(a) Demostrar que termina.
Como el dominio de FACT es N, utilizaremos el principiode inducción sobre N para la demostración
BASE: FACT(0) origina un número finito de cálculos
INDUCCIÓN :
HIPOTESIS: FACT(n - 1) origina un número finito de cálculos
PRUEBA: ¿FACT(n) origina un número finito?
Por definición , FACT(n) = FACT(n - 1) * n
Por HI , FACT(n - 1) termina
Entonces, FACT(n) también termina.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
21
(b) Demostrar que es correcta, o sea que :
FACT n n( ) !�
donde n ! se define como nn
i nn
! ��
�
���
�
���
���
1 0
01
BASE: FACT(0)=1
INDUCCIÓN:
HIPÓTESIS: FACT(n-1) = 1 * 2 * .. * (n - 1) n > 0
PRUEBA: ¿ FACT(n) = 1 * 2 * 3 * .. * n?
Por definición , 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: Análisis y Diseño de Algoritmos Recursivos
22
2.2 VERIFICACIÓN DE ALGORITMOSRECURSIVOS. FUNCIÓN LIMITADORA.
Consideremos el siguiente esquema :
{P(x)}
función f(x:T1) devuelve T2
opción
d(x): r:=h(x); /*Casos directos*/
�d(x): v:= f(ant(x)) ; r:=c(x,v);
/*Casos recursivos*/
fopción
devuelve r
ffunción
{Q(x,r)}
AD2 98/99. Tema 2: Análisis y Diseño 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 parámetros de la llamada recursivacumplen la precondición :
P(x) � � d(x) � P(ant(x))
2.- Demostración por inducción de la corrección :
P(x) � � d(x) � Q(ant(x),v) � Q(x,c(v,x))
H.I
3.- Validación del razonamiento inductivo :
Definir una función 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: Análisis y Diseño de Algoritmos Recursivos
24
La función limitadora :
- Valida el razonamiento por inducción
- Garantiza la terminación de la secuencia de llamadasrecursivas, ya que cada una tiene que tener un valornatural t(x) estrictamente inferior al de la anterior y enlos Naturales esto no puede ocurrir indefinidamente
- De hecho es una cota superior del número de llamadasque se realizan a la función (cuando la recursión eslineal).
La verificación no es un argumento a posteriori sino queguia el diseño y explica el algoritmo.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
25
3. ETAPAS DEL DISEÑO RECURSIVO.
Un diseño recursivo constará de las siguientes etapas:
1.- Definición del problema.
2.- Análisis de casos. Identificación de la funciónlimitadora.
3.-Transcripción algorítmica y verificación de cada caso.
4.-Validación de la inducción : la función limitadoradecrece estrictamente en las llamadas.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
26
DEFINICIÓN DEL PROBLEMA
� Nombre del algoritmo, sus datos y sus resultados� Precondición� Postcondición
ANÁLISIS POR CASOS. IDENTIFICACIÓN DE LAFUNCIÓN LIMITADORA.
Analizar los diferentes casos que se puedan presentar,identificando :
� Uno (o más) CASOS DIRECTOS
� Uno (o mas) CASOS RECURSIVOS
Concretar la FUNCIÓN LIMITADORA
OBSERVACIONES :
1.- Es preciso asegurarse de que se cubren todos los casosque pueden aparecer.
2.- Frecuentemente, la elección de los casos directos puederealizarse antes de decidir la función limitadora, bastacomparar P y Q para ver en qué casos es fácil obtener Q apartir de P. Así los casos directos pueden ayudar a buscar lafunción limitadora : decrementar ésta debe suponeraproximarse al caso directo.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
27
DISEÑO Y VERIFICACIÓN DE CADA CASO
Diseño del fragmento de programa que resuelve cada casojunto con su verificación :
(1) Al programar los casos recursivos es precisosuponer, como Hipótesis de Inducción, que lasllamadas recursivas funcionan correctamente.
(2) Para poder aplicar la inducción ha de garantizarseque, al evaluar la función limitadora sobre losparámetros que aparecen en cada llamada, se obtienenvalores estrictamente menores que los quecorresponden a los recibidos.
Como subproducto de (2) queda demostrado que larecursión es finita, ya que no puede haber infinitasllamadas recursivas tales que cada una de ellas tengaasociado un número natural estrictamente inferior alde la anterior.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
28
PROBLEMA 1: MULTIPLICACIÓN DE NATURALES
Supongamos que el repertorio de instrucciones disponiblessobre los naturales se reduce a la suma y la diferencia.Queremos diseñar un algoritmo recursivo para realizar lamultiplicación de naturales.
Definición :
algoritmo MULT (Datos a,b :entero
Resultado p :entero)
Precondición {a0 � b 0}
Postcondición {p=a*b}
Análisis de casos. Función limitadora.
Hemos de distinguir al menos un caso directo y otrorecursivo, éste nos ha de permitir hacer decrecer losparámetros en algún sentido.
Tomemos como función limitadora “a” e intentemosdecrementarla de 1 en 1 :
Caso DIRECTO : a=0
Casos RECURSIVOS : a>0
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
29
Solución al Caso Directo :
{a=0}
? ? � p :=0
{p=a*b}
Solución a los Casos recursivos :
Obsérvese 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: Análisis y Diseño de Algoritmos Recursivos
30
El algoritmo queda :
{a 0 � b 0}
función MULT(a,b:entero)devuelve entero;
var p :Natural
opción
a=0 : p :=0 ;
a>0 : p :=MULT(a-1,b) ;
{p=(a-1)*b}
p :=p+b ;
fopción
{p=a*b}
devuelve p
ffunción
{MULT(a,b)=a*b}
¿Cuántas llamadas recursivas hace MULT(a,b) ? a
PRIMERA MEJORA : Hacer decrecer el menor de a y b
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
31
SEGUNDA MEJORA :
Suponiendo que además de las operaciones + y - se puedenusar 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
Solución al Caso directo : igual que antes
Solución 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: Análisis y Diseño de Algoritmos Recursivos
32
Diseño 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)*bluego a*b=2*(a div 2)*b+b=MULT2(a div 2,b)+b
Algoritmo resultante :
{a 0 � b 0}
función MULT2(a,b:entero)devuelve entero;
var p :entero
opción
a=0 : p :=0 ;
a>0 : p :=MULT(adiv2,b);
{p=(a div 2)*b}
opción
par(a): p:=p*2;
�par(a): p:=p*2+b
fopción
{p=a*b}
devuelve p
ffunción
{MULT2(a,b)=a*b}
¿Cuántas llamadas recursivas se realizan en este caso ? log a
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
33
PROBLEMA 2: Cálculo del cociente y el resto de ladivisión entera. Dados dos enteros a �0 y b > 0 se deseaobtener q, r tales que
a = b * q + r � q �0, 0 �r < bSolo usaremos +, - y multiplicaciones y divisiones por 2.
DEFINICIÓN :
algoritmo DIVIDIR (Datos a,b :entero
Resultados q,r :entero)
Precondición {a0 � b>0}
Postcondición {a=b*q+r � 0 r<b � q0}
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
34
ANALISIS POR CASOS Y FUNCIÓN 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 función limitadora ay reducir su valor en la forma a-b. Esto requiere comoguarda que ab, quedando a<b como caso directo :
Casos directos : a<b
Casos recursivos : ab
Solución de los Casos Directos :
{b>0 �a<b}
? ? � q :=0 ; r :=a ;
{a=b*q+r � r<b � q0}
Solución de los Casos Recursivos :
{b>0 �ab}
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 � q0}
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
35
ALGORITMO RESULTANTE :
{a 0 � b>0}
acción dividir(ent a,b:entero;
sal q,r :entero)
opción
a<b: q :=0;r :=a ;
ab: dividir(a-b,b,q,r);
q :=q+1 ;
fopción
ffunción
{a=b*q+r �q0�0 r<b � q 0}
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
36
Ejercicios propuestos :
(1) ¿Podríamos basar el diseño en reducir a en 1 ?
(2) Diseñar un algoritmo reduciendo el parámetro “a”mediante una división por 2.
(3) Diseñar un algoritmo incrementando el parámetro “b”duplicándolo.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
37
PROBLEMA 3 : SUMAR LAS “i” PRIMERASCOMPONENTES DE UN VECTOR “v”.
Supongamos definido :
tipo TipoVector=vector [1..N] de entero ;
DEFINICIÓN :
algoritmo SUMAV (Datos v :TipoVector ;i :entero
Resultado s : entero)
Precondición : {0 i N}
Postcondición : {SUMAV(v)=�j=1..i v[j] }
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
38
ANÁLISIS DE CASOS Y FUNCIÓN LIMITADORA :
CASO DIRECTO : i=0, anula el dominio del cuantificadorde Q. La solución es s :=0
CASOS RECURSIVOS : i>0
Como función limitadora elegiremos el valor de “i”
{i N � 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: Análisis y Diseño de Algoritmos Recursivos
39
Algoritmo resultante :
función SumaV(v:TipoVector;i:entero)
devuelve entero
var s :entero ;
opción
i=0 : s :=0 ;
i>0 : s :=SumaV(v,i-1) ;
s :=s+v[i] ;
fopción
devuelve s
ffunción
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
40
4. ANÁLISIS DE LA COMPLEJIDAD TEMPORAL DELOS ALGORITMOS RECURSIVOS.
Si la definición recursiva es:
f xh x si d x
c x f ant x f ant x si d xm
( )( ) ( )
( , ( ( )),..., ( ( ))) ( )�
��� 1
el coste del algoritmo asociado vendrá frecuentementedado por:
coste(n) = m coste( F(n) ) + g(n) si n > n0
coste (n) = no importa si n n0
donde:
� F es la función de reducción de la talla (n) en cadallamada recursiva. Normalmente F(n)<n, y másconcretamente: F(n) = n–c ó F(n) = n/c.
� m es el número de llamadas recursivas que generacada llamada a f(x), suponiendo que en todas ellas latalla se reduzca de la misma forma.
� g(n) es el coste de f(x) excluidas las llamadasrecursivas.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
41
Resolveremos las relaciones de recurrencia por elmétodo de sustitución .
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
42
EJEMPLO (Aplicación del método de sustitución).
función máximo(a: vector; i : entero)
devuelve entero;opción
i=1: devuelve a[1];i>1: devuelve mayor(máximo(a, i-1 ),a[i]));
fopciónffunción
La primera llamada es máximo(a,n), siendo n el nºde elementos del vector.
• La talla del problema es n.
• No hay diferentes instancias; en cualquier casose recorre todo el vector.
Las relaciones de recurrencia serán:
coste( 1 ) = K1
coste( n ) = coste( n-1 ) + K2 n>1.
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
43
El método de sustitución consiste en ir desarrollando lafunción, tomando valores decrecientes de n ysustituyendo en coste(n) hasta llegar al caso en quecesa la recurrencia (caso directo).
En el ejemplo anterior:
coste(1) = K1
coste(n) = coste(n-1) + K2 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 ���(n).
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
44
Para obtener el orden de las relaciones máshabituales, se puede aplicar el siguiente teorema.
TEOREMA. Sean a 1, b � R+, n, c ��N.Supóngase que f verifica para n c las relacionesindicadas. Entonces:
Caso 1
f(n) = a f(n-c) + b a = 1 � �(n)
a > 1 � �(an/c)
Caso 2
f(n) = a f(n-c) + bn + d a = 1 � �(n2)
a > 1 � �(an/c)
Caso 3
f(n) = a f(n/c) + b a = 1 � �(logcn)
a > 1 � �(nlogca)
Caso 4
f(n) = a f(n/c) + bn + d a < c � �(n)
a = c � �(n logcn)
a > c � �(nlogca)
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
45
Ejemplo : Las torres de Hanoi , en el que se debenmover n discos de uno en uno desde una pila inicial aotra destino haciendo uso de una tercera pila auxiliar,con la restricción de que cualquier disco, en cualquiermomento, sólo puede tener por debajo de él discos demayor diámetro.
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)
fsifprocedimiento,
donde mueve_disco_sup(a,b � tiene coste �(1).
Talla del problema: n. No hay instancias diferentes.
Relaciones de recurrencia de la función de coste:
coste(n) = 2 coste(n-1) + K1 n>0
coste(n) = K2 n=0
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
46
Al resolver por sustitución:
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 =......
= 2ncoste(0) +2
n-1 K1 + 2
n-2 K1 + ... + 2 K1 + K1
= 2n K2 + K1(2
n-1) � �(2
n).
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
47
EJEMPLO: Búsqueda dicotómica. (Aplicación de lasrelaciones de recurrencia a algoritmos iterativos.)
{ v está ordenado }procedimiento dicotómica
(v: vector �1..n � de entero; n, x: entero; sal está: lógico; sal m: entero) es
var i,j: entero fvar;i:=1 ; j:=n; está := falso;repetir
m := (i+j) div 2;opciónv[m] > x: j := m - 1;v[m] < x: i := m + 1;v[m] = x: está := verdadero;
fopciónhasta que i>j está
fprocedimiento{1 �m�n�((está � v �m�=x) �
( �está � �k:1 �k�n:v �k �x)}
La talla del problema es n = j-i+1 �j-i
Caso peor (x no está en v): como tras cada iteración latalla del problema disminuye aproximadamente a lamitad, se tiene que:
coste(n) = K1 + coste(n/2) n>1
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
48
(Caso peor)
costep(n) = K1 + costep(n/2)) n>1
costep(1) = K2
Si se resuelve la recurrencia por sustitución:
costep(n)
= K1 + costep(n/2)
= K1 + K1 + costep(n/22)
= 2 K1 + costep(n/22)
= 2 K1 + K1 + costep(n/23)
= 3 K1 + K1 + costep(n/24) = ....
= (log2n) K1 + costep(n/2log n
))
= (log2n) K1 + costep(n/n)
= (log2n) K1 + K2 ���( logn ).
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
49
Caso mejor: x se encuentra en la primera iteración.
Resumen:
coste(n) ���( logn )
coste(n) ��!( 1 )
AD2 98/99. Tema 2: Análisis y Diseño de Algoritmos Recursivos
50