Documente Academic
Documente Profesional
Documente Cultură
Faccois de la Rochefoucald
(1613-1680) Escritor francés
Objetivos de aprendizaje
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:
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.
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
= (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
por el principio de inducción matemática se sigue que P(n) es verdadera para todo n1.
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
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
Sh = A x Ch hipotesis inductiva
para n = h+1 se tiene:
Sh+1 = Sh + A ............(a)
Ch+1 = Ch + 1 .............(b)
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
Ejemplo 4
Definicion recursiva de tren
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
Ejemplo 6
El objetivo del programa recursivo, es realizar una serie de llamadas hasta que la
secuencia se define en un punto.
Ejemplo 7
La función Factorial puede ser desarrollada iterativamente o recursivamente.
Matemáticamente de define como:
Ejemplo 8:
la secuencia de fibonacci son 1, 1, 2, 3, 5, 8, ... los cuales se determinan por la función:
fib(int n)
{
if(n==0 || n==1) return 1; /* condición básica */
else
return (fib(n-1)+fib(n-2)); /* doble llamada */
}
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
Ejemplo 10
Sumar los elementos de una lista enlazada (Desarrollar en clase)
Relación de recurrencia
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
Ejemplo 11
an = a n – 1 + a n–2
Donde K = 2, a0 = 1 a1 = a2 = -1
n
Podemos remplazar tn por x
donde x es uma constante desconocida por el momento
Las raíces de esta ecuación están en alguno de los tres casos siguientes:
Ejemplo 12
Con raíces r1 = 2 y r2 = -3
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)
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
Ejemplo 13
3an-1 – 6 a n – 2 = 3 n (c)
an – 5 a n – 1 + 6 a n-2 = 0 (d)
Ejemplo 14
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
nuevamente
si remplazamos n con n-1 en (a) tenemos
an-2 = a- n – 3 +3 (d)
an = a n – k +k * 3
si hacemos K = n-1 tenemos
an = a 1 +(n-1) * 3
y como a1 = 2
tenemos finalmente
an = 2 +3 * (n-1)
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.
Los algoritmos divide y vencerás son algoritmos recursivos que constan de dos partes:
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
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
Ejemplo 16
Multiplicación de matrices
Ejemplo 17
Torres de Hanoi
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
1 n=0
an =
2a n – 1 + 1 otro caso
an - 2a n – 1 -1 = 0
Resolver
Ejemplo 18
MERGESORT
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.
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 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
El algoritmo realiza dos llamadas recursivas de orden T(n/2), y una llamada a intercala
de orden O(n), por tanto
Remplazamos en (b)
T(n) = 8T(n/8) +3n
Sucesivamente, tenemos que
T(n) = 2kT(n/2k) +kn (c)
TEOREMA
T(n)/n = 1 + log n
Ejercicios Propuestos
1 Proporcione 3 ejemplos de proposiciones matemáticas.
Demuéstrelas por el método de inducción matemática
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
b) FUNCION COMPARA(N, B)
INICIO
A N
D B
MIENTRAS D > 0
A A + B
D D - 1
FIN MIENTRAS
Retornar A
Fin
RECURSION
a) an = 2a n – 1 a0 = 1
b) an = 2a n – 1 +5 a0 = 2
a. Algoritmo de Hanoi
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.