Anda di halaman 1dari 20

Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

GUIA II INDUCCION MATEMATICA


RECURSION- DIVIDE Y VENCERAS
Tres clases hay de ignorancia: no saber lo que debiera
saberse, saber mal lo que se sabe, y saber lo que no
debiera saberse.

Faccois de la Rochefoucald
(1613-1680) Escritor francés

Donald Ervin Knuth Nacido el 10 de enero de


1938, es uno de los más renombrados científicos
de la computación, profesor emerito de la
Universidad de Stanford. Es conocido como
autor de múltiples volúmenes: El arte de la
programación de computadoras, considerado
como una referencia en el área de ciencias de la
computación, prácticamente fue el creador del
análisis de algoritmos y contribuyo
significativamente a varias ramas de teoría de
las ciencias de la computación

Objetivos de aprendizaje

1. Conocer las técnicas de inducción matemática


2. Conocer La técnica de recursividad y recurrencias
3. Conocer La técnica divide y vencerás

I INDUCCION MATEMATICA
Consideremos que la proposición P(n) definida en un dominio. Se desea
demostrar que P(n) es verdadera para todo n en el dominio. Si verificamos que:

1 P(k) es verdadera, para k un entero (positivo, negativo o cero) fijo.


2 Si P(h) es verdadera para todo h > k llamada (hipótesis inductiva)
implica que P(h+1) es verdadera.
3 P(n) es verdadera para todo n en su dominio.

Quiere decir que si se cumple los pasos 1 y 2 entonces por el principio de inducción
afirmamos que se cumple el paso 3, es decir P(n) es verdadera para todo n.

Augusto Cortez Vásquez Pag. 1/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Ejemplo 1
 i = 1 + 2 + 3 +... n = n . (n + 1)
2
sea el enunciado
P(n) = 1 + 2 + 3 +... n = n . (n + 1)
2

1 para n = 1 P(1) = 1 = 1 . 2 = 1
2

2 supongamos que para n=h > 1, P(h) es verdadera hipótesis


inductiva

es decir P(h) = 1 + 2 + 3 +... h = h.(h + 1)


2
tenemos que
3 P(h + 1) = 1 + 2 + 3 +... h + h+1

= (1 + 2 + 3 +... h) + h+1

= h.(h + 1)+h+1
2
= (h+1) . (h+2)
2

por el principio de inducción matemática se sigue que P(n) es verdadera para todo n  1.

Ejemplo 2
Probar  i3 = (  i )2
sea el enunciado
3 3 3 3 2
P(n) = 1 + 2 + 3 +...n =(1 + 2 + 3 +... n)
3 2
1 para n = 1 P(1) = 1 = 1 = 1

2 Supongamos que para n=h>1, P(n) es verdadera hipótesis inductiva.


3 3 3 3 2
es decir P(h)=1 + 2 + 3 +...h =(1 + 2 + 3 +... h)
tenemos que :
3 3 3 3
3 P(h + 1) = 1 + 2 + 3 +...h
3 3 3 3 3
= (1 +2 +3 +...h )+ (h+1)
2 3
= (1 + 2 + 3 +... h) +(h+1)
2
= (1 + 2 + 3 +... h+ h+1)

por el principio de inducción matemática se sigue que P(n) es verdadera para todo n1.

Augusto Cortez Vásquez Pag. 2/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Ejemplo 3

FUNCION CUADRADO(A)
Inicio
C  0
S  0
MIENTRAS (C < A)
A A2
S  S + A
C  C + 1
FIN MIENTRAS
RETORNAR(S)
Fin

El algoritmo recibe como entrada A y devuelve S= A2


Sea la proposición P(n) : Sn = A * Cn

donde Sn y Cn son los valores de S e C después de haber pasado por el ciclo


MIENTRAS i veces.

para n = 0
P(0) : S0 = 0 = A x C0 = A * 0
porque S e B no han pasado aún por el ciclo MIENTRAS

Para n = h  0

supongamos que P(h) : es verdadero para h  0

Sh = A x Ch hipotesis inductiva
para n = h+1 se tiene:
Sh+1 = Sh + A ............(a)

Ch+1 = Ch + 1 .............(b)

De aquí se tiene que:


Reemplazando h.i. en (a)
Sh+1 = A * Ch + A = A * (Ch +1 )
= A x Ch+1 por (b)

luego, se cumple Sh+1 = A * Ch+1

por lo cual P(n) es verdadero para todo n

Augusto Cortez Vásquez Pag. 3/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

II Recursion
La recursión es un método que, directa o indirectamente, se hace una llamada así
mismo. Esto puede parecer un circulo vicioso: ¿cómo un método F puede resolver un
problema llamándose a si mismo?
La clave esta en que el método F se llama así mismo pero en instancias diferentes, mas
simples, en algún sentido adecuado

Ejemplo

Los ficheros en un computador se almacenan generalmente en directorios. Los


usuarios pueden crear directorios, que a su vez almacenan mas ficheros y
directorios. Suponga que deseamos examinar cada fichero de un directorio D,
incluyendo todos los ficheros de sus subdirectorios ( y sus subdirectorios, y así
sucesivamente). Esto se puede hacer examinando recursivamente los ficheros de
cada subdirectorio junto con todos los ficheros en el directorio D.

La recursión es una técnica que se utiliza en la vida cotidiana

La recursión es un concepto fundamental en matemáticas e informática. La definición


mas sencilla es que una función se llama recursiva si se llama a si mismo. Una función
recursiva es aquella función que se define en términos de si mismo. Una programa o
función recursiva requiere una condición de terminación que autorice al programa o
función a dejar de llamarse a si mismo.

Los lenguajes de programación mas conocidos permiten la implantación de algoritmos


recursivos. Esta es una metodología que se emplea para la solución de problemas de
computación y en muchos casos facilita resolverlos.

Augusto Cortez Vásquez Pag. 4/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Ejemplo 4
Definicion recursiva de tren

TREN : Locomotora + Vagones

Vagones : Vagon + Vagones / Vagon

Ejemplo 5
Sea S(N) : suma de los N primeros números. S(N) puede definirse :

Forma recursiva
Algoritmo iterativo

S(1) = 1
S(N) = S(N-1) +N Entero S(Entero N)
Inicio
S=0
Para i desde 1 hasta N
Forma explicita
S = S +i
S(N) = N*(N+1) /2 FinPara
Retornar( S)
Fin
Algoritmo recursivo
Entero Suma()
Inicio
Leer N Entero S(Entero N)
Algoritmo
Inicio recursivo
Escribir S(N)
Fin Si N = 1
Retornar 1
Sino
Retornar( S(N-1)+N)
Fin si
Fin
La función Suma lee N y luego escribe
S(N) que es la suma de los N primeros números

Augusto Cortez Vásquez Pag. 5/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Debemos tener en cuenta que la recursión no siempre es apropiada. En ocasiones las


llamadas recursivas consumen tiempo y limitan el valor de N para el cual se puede
ejecutar el programa. No es conveniente, por ejemplo usar la recursión para sustituir
un simple bucle.

Ejemplo 6

Funcion Potencia(a:entero; n:natural) dev (p:entero)


Caso n=0 retornar 1
Caso n >0 return a * Potencia(a,n-1)
Fin
Accion Principal()
Inicio
Leer a,n
Escribir Potencia(a,n)
Fin

Definición: Una función f es recursiva si en su cuerpo contiene una aplicación de f, es


decir, si se puede activarse a si misma.

Si la llamada sucede dentro de la propia función se dice que es directamente recursiva.


En cambio si la función llama a otra y esta a su vez llama a la primera se dice que es
recursión indirecta.

El objetivo del programa recursivo, es realizar una serie de llamadas hasta que la
secuencia se define en un punto.

Las directrices para una función recursiva son:


- Cada vez que se hace una llamada recursiva en una función, el programa deberá
comprobar que se satisface una condición básica con un determinado parámetro
puesto al valor mínimo.
- Cada vez que se hace la llamada a la función, los parámetros enviados a la misma,
deberán ser de algún modo más “simple”, es decir, su valor tender a la condición
básica.

Ejemplo 7
La función Factorial puede ser desarrollada iterativamente o recursivamente.
Matemáticamente de define como:

N! = N (N-1)! Para N>1 1!=1

Ejemplo 8:
la secuencia de fibonacci son 1, 1, 2, 3, 5, 8, ... los cuales se determinan por la función:

Augusto Cortez Vásquez Pag. 6/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Fib(n) = Fib(n-1) + Fib(n-2) si n>1,


Fib(n)=1 si n <= 1

fib(int n)
{
if(n==0 || n==1) return 1; /* condición básica */
else
return (fib(n-1)+fib(n-2)); /* doble llamada */
}

Para fib(4) se tienen las siguientes entradas y salidas.

En este caso se puede observar que la solución planteada de fibonacci es impracticable


para valores de n grandes. Cada fib() realiza dos llamadas, por lo que el número de
llamadas aumenta en proporción geométrica.
¿ Conviene usar recursión siempre?¿ Que pasa con la memoria?

Caso iterativo para fibonacci


Fib(int i)
{ int i,j,k;
if(n>0) {
i=0;
j=1;
for(k=2; k<=n; k++)
{
j=j+i;
i=j-i;
}
return(j);
else return(0);
}

Ejemplo 9
Sumar los elementos de un vector (Desarrollar en clase)

Forma iterativa
a) Se recorre el vector de izquierda a derecha sumando uno a uno sus elementos
b) También puede hacerse el recorrido de derecha a izquierda

Forma recursiva
c) Se recorre el vector de izquierda a derecha en forma recursiva sumando uno
a uno sus elementos
d) También puede hacerse el recorrido en forma recursiva de derecha a
izquierda
e) Puede hacerse también una suma dicotómica

Augusto Cortez Vásquez Pag. 7/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Ejemplo 10
Sumar los elementos de una lista enlazada (Desarrollar en clase)

Relación de recurrencia

La relación de recurrencia an+1 = 3 an para n ≥ 0 no define una única progresión


geométrica, pues la secuencia: 7,21,63,189, también satisface la relación. Para
distinguir una sucesión particular descrita necesitamos conocer uno del término de la
sucesión. Por tanto
an+1 = 3 an n ≥ 0 donde a0 = 5 define 5, 15, 45, 135….

Mientras que
an+1 = 3 an n ≥ 0 donde a0 = 3 define 3, 19, 27, 81….

Recurrencia homogénea
Una recurrencia es homogénea con coeficientes constantes, si tiene la forma

a0tn + a1tn-1 + a2tn-2 +... aktn-k = 0 para todo ai constante

en donde los t i son los valores que estamos buscando . La combinación


lineal de los tn-i es igual a 0.

Ejemplo 11

an = a n – 1 + a n–2

podemos reescribir an - a- n – 1 - a- n – 2 = 0 Rec. homogenea

la recurrencia corresponde a la serie de fibonacci.

Donde K = 2, a0 = 1 a1 = a2 = -1
n
Podemos remplazar tn por x
donde x es uma constante desconocida por el momento

a0 x n + a1 x n-1 + a2 x n-2 +... ak x n = 0


La ecuación se satisface si x = 0 siendo la solución trivial
en caso contrario la ecuación se satisface si existe k tal que

a0 x k + a1 x k-1 + a2 x k-2 +... ak = 0 ecuacion característica

P(x) : a0 x k + a1 x k-1 + a2 x k-2 +... ak polinômio característico

Augusto Cortez Vásquez Pag. 8/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Las raíces de esta ecuación están en alguno de los tres casos siguientes:

r1, r2 son números reales distintos


r1, r2 son números complejos conjugados
r1, r2 son números reales iguales

en todos los casos r1, r2 son las raíces características

Ejemplo 12

an +an-1 - 6an-2 = 0 donde n  2 a0 =1 a1 = 2

P(x) : x2 + x – 6 polinômio característico

Cuya solución esta dada por (x+3)(x-2)

Con raíces r1 = 2 y r2 = -3

La solución general es de la forma


an = c1 r1 n + c2 r2 n = c1 2 n + c2 (-3) n

cuando n = 0
a0 = 1= c1 20 + c2 (-3)0 = c1 + c2 (a)
cuando n = 1
a1 = 2 = c1 21 + c2 (-3)1 = 2c1 - 3 c2 (b)

resolviendo (a) y (b)

c1 = 1 y c2 = 0
por tanto
an = 2 n para n  0
Es la única solución de la recurrencia dada.

Recurrencia no homogénea
Una recurrencia es no homogénea cuando la combinación lineal no es igual a
cero, es decir, no es cierto que toda la combinación lineal de las soluciones sea
una solución

a0tn + a1tn-1 + a2tn-2 +... aktn-k = bn P(n) para todo b, ai constante


P(n) es um polinomio en n

Ejemplo 13

an – 2 a n – 1 = 3 n b=3 P(n) = 1 (a)

Augusto Cortez Vásquez Pag. 9/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

multiplicando (a) por 3

3an – 6 a n – 1 = 3 n+1 (b)

Sustituyendo n por n-1 en (b)

3an-1 – 6 a n – 2 = 3 n (c)

Restando (a) y (c)

an – 5 a n – 1 + 6 a n-2 = 0 (d)

(d) es uma ecuacion homogenea y se resuelve com la técnica antes


expuesta.

Solucion de una recurrencia mediante remplazos sucesivos

Ejemplo 14

Consideremos la siguiente serie S : 2, 5, 8, 11, 14...


Se quiere hallar la suma de los N primeros numeros de la serie
S puede definirse de la siguiente forma

an = an-1 + 3 para n > 1 a1 = 2


Asi
n 1 2 3 4 5
an 2 5 8 11 14

Augusto Cortez Vásquez Pag. 10/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

olucion iterativa
Accion Principal()
Inicio
Leer N Accion SUMA(K)
Escribir SUMA(N) Inicio
S=2
V=5
Fin
Para i desde 1 hasta K-1
S=S+V
V=V +3
FinPara
Retornar S
Fin
Solución recursiva

Accion Principal()
Inicio
Leer N Accion SUMA(K)
S=0 Inicio
Para i desde 1 hasta N Si k=1
S = S + SUMA(i) Retornar 2
FinPara Sino
Escribir S Retornar SUMA(K-1) + 3
Fin FinSi

¿ De que orden es el algoritmo ?


an = a n – 1 +3 a1 = 2 (a)

esta recurrencia puede resolverse mediante la técnica de polinomio


característico o mediante reemplazos sucesivos

si remplazamos n con n-1 en (a) tenemos


an-1 = a- n – 2 +3 (b)

substituímos (b) en (a)


tenemos an = a- n – 2 +3 + 3 = a n – 2 +3 * 2 (c)

nuevamente
si remplazamos n con n-1 en (a) tenemos
an-2 = a- n – 3 +3 (d)

sustituimos (d) en (c)


an = a- n – 3 +3 + 3*2 = a n – 3 +3 * 3
em general

an = a n – k +k * 3
si hacemos K = n-1 tenemos

Augusto Cortez Vásquez Pag. 11/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

an = a 1 +(n-1) * 3
y como a1 = 2
tenemos finalmente
an = 2 +3 * (n-1)

Así decimos que el algoritmo con ecuación de recurrencia es de orden O(3n)

Divide y venceras
La técnica divide y vencerás muestra que es posible dividir un problema en
subproblemas, y que a su vez estos se subdividen en mas subproblemas y combinar
entonces las soluciones de los subejemplares para resolver el caso original. Durante esta
subdivisión pueden ocurrir que aparezcan ejemplares de problemas duplicados, si no
prestamos atención a esta duplicación, podríamos obtener una solución no eficiente. La
técnica de programación dinámica consiste en atender a cada subejemplar y guardar su
solucion para su uso posterior, consiguiendo así un algoritmo eficiente. El objetivo de
la programación dinámica es evitar que un cálculo se repita dos veces, y para ello se
mantiene una tabla de resultados conocidos que se vaya llenando a medida que se
resuelven los subcasos.
Mientras que el método divide y vencerás es un método descendente de refinamientos
progresivo. Se ataca de inmediato el caso completo, dividiéndolos en subcasos más
pequeños, a medida que progresa el algoritmo. La programación dinámica es un
método ascendente, se empieza con los subcasos más pequeños, y por tanto más
sencillos, combinando sus soluciones, obteniendo así las soluciones para los subcasos
de tamaño cada vez mayores, hasta que finalmente se llega a la solución del caso
original.

Para resolver cada subproblema se tienen dos alternativas:


El subproblema es suficientemente pequeño para dar una solución o
El subproblema todavía es de gran tamaño el cual se debe dividir aplicando
recursivamente la técnica.

Los algoritmos divide y vencerás son algoritmos recursivos que constan de dos partes:

Dividir: se resuelve recursivamente problemas mas pequeños (excepto, por


supuesto los casos bases)

Vencer : La solución al problema original se consigue a partir de las soluciones


a los subproblemas.

Tradicionalmente las rutinas en las que el algoritmo contiene al menos dos llamadas
recursivas se llaman divide y vencerás, al contrario que las rutinas cuyo texto contiene
solamente una llamada recursiva. Además los subproblemas deben ser disjuntos (mas
exactamente, esencialmente sin superposiciones) para evitar los costos excesivos que ya
se vieron en el calculo recursivo de los números de fibonacci

Algoritmo

DivideyVencerás( limite del problema)

Augusto Cortez Vásquez Pag. 12/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Inicio
Si la condición define un caso suficientemente simple entonces
Dar la solución del caso simple
Sino
Dividir el problema en subproblemas
DivideyVencerás( límite del subproblema 1)
…………
DivideyVencerás( límite del subproblema n)
Fin_si
Fin

Ejemplo 15
Multiplicación de enteros grandes

Sea X = 23435676 Y = 54871262

Podemos hacer X =X1X2 Y=Y1Y2


Entonces X * Y = X1*Y1 * 108 + (X1*Y2+ X2*Y1) * 104 + Y1*Y2

Ejemplo 16
Multiplicación de matrices

Ejemplo 17

Torres de Hanoi

// Traslada m anillos mas pequeños desde la barra i hasta la barra j

Funcion Hanoi(m,i,j,)
Si m>0
Hannoi(m-1 , i , 6 - i - j)
Escribir i, “” j
Hannoi(m-1 , 6-i-j , j)
FinSi
Fin

Accion Principal()
Inicio
Leer m
Escribir Hanoi(m,1,3)
Fin

an = numero de veces que se utiliza (o ejecuta) la instrucción escribir en una


llamada a Hanoi()

Augusto Cortez Vásquez Pag. 13/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

1 n=0
an =
2a n – 1 + 1 otro caso

an - 2a n – 1 -1 = 0

Resolver

Ejemplo 18

MERGESORT

La recursión puede utilizarse para desarrollar algoritmos subcuadraticos [WEISS,


2000]. Un algoritmo divide y vencerás en el cual se resuelven recursivamente dos
problemas con la mitad del tamaño, con una sobrecarga de O(N), es un algoritmo
O(NLOg N). Mergesort es uno de estos algoritmos, ofreciendo una mejor cota, al menos
a nivel teórico, que las afirmadas para Shellsort. [CORTEZ 1999]
EL algoritmo Mergesort consta de tres pasos:

1 Si el numero de elementos a ordenar es 0 o 1, finalizar


2 Ordenar recursivamente las dos mitades del vector
3 Mezclar las dos mitades ordenadas en un vector ordenado.

El algoritmo realiza lo siguiente

Accion Merge_Sort(S,i,j)
Inicio
Si i = j retornar
M=(i+j)/2
Merge_Sort(S, i, m)
Merge_Sort(S , m+1, j)
Merge(S, i , m, j, C)
Para k dese i hasta j
Sk = Ck
FinPara
Fin

Para afirmar que el algoritmo es O(N Log N), es suficiente demostrar que la mezcla
ordenada de dos vectores ordenados puede realizarse en tiempo lineal. En la siguiente
subsección veremos como mezclar dos vectores A y B, colocando el resultado en un
tercer vector. Después mostraremos una implementación sencilla de mergesort. La
rutina de mezcla es la piedra angular de muchos algoritmos de ordenación externa.

Augusto Cortez Vásquez Pag. 14/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

private static void mergesort (int [] a, int [] Temp, int izq, int der)
{ if(izq < der )
int centro (izq + der ) / 2;
mergesort (a , temp , izq, centro)
mergesort (a , temp , centro +1 , der)
mezclar (a, temp, izq, centro+1, der)
}

private static void clasificar (int [] a)


{ int [] temp = new int [a.length];
mergesort (a,temp,0,a.length-1);
}

private static void mezclar (int [] a , int [] temp, int posizq, int posder, int posfin )
{ int finizq = posder -1
int posaux = posizq
int numelem = posfin – posder +1
// ciclo principal
While( posizq <=finizq && posder <= posfin)
if(a[posizq].menorque(a[posder]))
temp[posaux++] = a[posizq++];
else
temp[posaux++] = a[posder++];
// copia el resto de la primera mitad
While( posizq <=finizq )
temp[posaux++] = a[posizq++];
// copia el resto de la segunda mitad
While( posder <=posfin )
temp[posaux++] = a[posder++];
// copia el vector temporal en el original
for(int i = 0; i < numelem ; i++ , posfin--)
a[i] = temp[i]

Augusto
} Cortez Vásquez Pag. 15/20
Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Análisis del método de intercalación es un ejemplo clásico de las técnicas con


que se analizan las rutinas recursivas

¿ De que orden asintótico es el Merge_Sort ?

El algoritmo realiza dos llamadas recursivas de orden T(n/2), y una llamada a intercala
de orden O(n), por tanto

Tenemos que T(n) = 2T(n/2) +n (a)

Sustituimos n por n/2


2T(n/2) = 2 (2T(n/4) +n) = 4 T(n/4) + n
Remplazamos en (a)
T(n) = 4T(n/4) +2n (b)

Sustituimos n por n/4


4T(n/4) = 4 (2T(n/8) +n) = 8 T(n/8) + n

Remplazamos en (b)
T(n) = 8T(n/8) +3n
Sucesivamente, tenemos que
T(n) = 2kT(n/2k) +kn (c)

Hacemos k = log n luego n = 2k


En (c)

T(n) = nT(1) +n log n = n + nlog n


Por tanto el algoritmo es de orden O(nlog n)

TEOREMA

El ordenamiento por fusion es O(n log n) en el peor de los casos

Otro metodo de demostrar que Merge_Sort es de orden O(nlogn)

Tenemos que T(n) = 2T(n/2) +n (a)

Dividiendo (a) entre n obtenemos

T(n) / n = T(n/2) / (n/2) +1 (b)

Haciendo n = n/2 en (b) obtenemos

T(n/2) / (n/2) = T(n/4) / (n/4) +1 (c)

Haciendo n = n/4 en (b) obtenemos

T(n/4) / (n/4) = T(n/8) / (n/8) +1 (c)

Augusto Cortez Vásquez Pag. 16/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

Si seguimos tenemos finalmente

T(2) / 2 = T(1) / 1 +1 (d)

Si sumamos ambos lados de todas las ecuaciones, tenemos

T(n)/n = T(1)/ 1 +1 +1+1…+1

Como T(1) = 1, y hay log n unos en el lado derecho , tenemos

T(n)/n = 1 + log n

Multiplicamos por n y tenemos T(n) = n + n log n

Por tanto Merge_Sort es de orden O(nlogn)

Ejercicios Propuestos
1 Proporcione 3 ejemplos de proposiciones matemáticas.
Demuéstrelas por el método de inducción matemática

2 Probar por el método de inducción que:

a) FUNCION ABC(Q, Y)
INICIO
A  1
Mientras ( Y > 0 )
A  A *Q
Y  Y - 1
FIN MIENTRAS
Retornar A
RETORNAR

Y
El algoritmo recibe como entrada Q y Y, y devuelve A = Q
Y Y
Sea la proposición P(n) : An * Q n = Q

donde An y Yn son los valores de A y Y después de haber pasado por el


ciclo MIENTRAS n >=0 veces.

b) FUNCION COMPARA(N, B)
INICIO
A  N
D  B
MIENTRAS D > 0
A  A + B

Augusto Cortez Vásquez Pag. 17/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

D  D - 1
FIN MIENTRAS
Retornar A
Fin

El algoritmo recibe como entrada N y B, y devuelve:


2
A = N+ B

3 Construya un algoritmo para hallar el cociente de dos enteros


sin realizar divisiones. Demuestre por inducción que el
algoritmo funciona

4 Construya un algoritmo para hallar el producto de dos enteros


sin realizar multiplicaciones. Demuestre por inducción que el
algoritmo funciona

RECURSION

5 Defina los siguientes conjuntos en forma recursiva


a) El conjunto de todas las expresiones aritméticas
b) El conjunto de los números enteros positivos múltiplos de K
c) El conjunto de todas las proposiciones del calculo proposicional.

6 Construya un algoritmo recursivo para


a) Sumar los elementos de un vector
b) Invertir el orden de un vector
c) Comparar si dos listas son iguales o no
d) Hallar la suma de los elementos de un vector en forma recursiva dicotómica

7 Resuelva las siguientes recurrencias por el método de polinomio característico y


por el método de reemplazos sucesivos

a) an = 2a n – 1 a0 = 1

b) an = 2a n – 1 +5 a0 = 2

8 Dada la secuencia 4, 6, 14, 26,… construya un algoritmo recursivo y


otro no recursivo para hallar la suma de los n primeros terminos de la
secuencia. Compare los algoritmos y comente.

9 Especifique la solución. ¿ De que orden es el algoritmo? Construya el


algoritmo. Determine el orden y compare el orden obtenido con lo que
supuso.
a. Intercalar dos vectores ordenados en uno igualmente ordenado
b. Multiplicar dos matrices
c. Hallar el producto de los elementos de la matriz diagonal

10 Especifique, implemente y evalúe

a. Algoritmo de Hanoi

Augusto Cortez Vásquez Pag. 18/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

b. Suma dicotómica de un vector

11 Especifique, implemente y evalúe

a. Ordenamiento MergeSort (clasificación divide y vencerás)


b. Hallar la subsecuencia de suma máxima (divide y vencerás)
c. Búsqueda dicotómica en un vector
d. Comparar si dos vectores son iguales
e. Verificar si dos matrices tienen por lo menos una fila con los
mismos elementos

REFERENCIAS BIBLIOGRAFICAS
1. [HERNANDEZ 2001] Hernández, R.; Lázaro, J.C.; Dormido, R.; Ros, S.
“Estructura de Datos y Algoritmos”; Prentice Hall 2001, Madrid España.

2. [BRASSARD 1998] Brassard,G. Bratley,P. ”Fundamentos de Algoritmia”, Prentice


Hall 1998 Madrid

3. [CORTEZ 1999] Cortez Vásquez, augusto. ”Matemática Discreta”, UNMSM FISI


Lima 1999.

4 [CORTEZ 2002] Cortez Vásquez, augusto. ”Algorítmica y Programación”, UCSS


Lima 2002.

5 [CORTEZ 2002] Cortez Vásquez, augusto. ”Estructura de datos y algoritmos,


estructuras no lineales”, URP Lima 2002.

6 [GRASSMANN 1996] Grassmann W., Tremblay J.”Matemática Discreta y Lógica”;


Prentice Hall 1996.

7 [GRIMALDI 1994] Grimaldi Ralph ”Matemáticas Discreta y Combinatoria”;


Addison-Wesley 1994

8 [GUTIERREZ 1993] Gutiérrez Xavier Franch ”Estructuras de datos,


Especificación, diseño e implementación”; Edición UPC Barcelona España 19934

9 [JAIME 2002] Jaime, Alberto. ”Estructuras de datos y Algoritmos”; Prentice Hall


2002 Bogota D.C.

10 [JOHNSONBAUGH 1999] Johnsonbaugh Richard ”Mateamticas Discretas”;


Prentice Hall 1999, Pags.

11 [LIPSCHUTZ 1987] Lipschutz Seymour ”Estructura de datos”, Mc Graw-


Hill,1987

12 [CARMONA 1999] Carmona, Poyato Angel y Otros ”Estructuta de Datos”, Caja


Sur Universidad de Cordova España 1999

Augusto Cortez Vásquez Pag. 19/20


Algoritmica III – Inducción, recurrencias y Divide y Vencerás 2009-II

13 [SEDGEWICK 1993] Stroustrup Bjarne ”El C++ Lenguaje de programacion”;


Addison-Wesley 1993 , Wilmington-Delaware EUA.

14 [TENEMBNAUM 1993] Tenembaum,A.Langsam Y.Augenstein M. ”Estructuras


de datos en C”, Prentice Hall 1993.

15 [WEISS 2000] Weiss, Mark Allen. ”Estructuras de datos en JAVA”; Addison-


Wesley, 2000.

Augusto Cortez Vásquez Pag. 20/20