Documentos de Académico
Documentos de Profesional
Documentos de Cultura
S0 ® S1 ® S2 ® … ® Sj
E n t r a d a : i n d i c a l a s precondiciones
S a l i d a : i n d i c a l a s poscondi ci ones
I d e a i t e r at i v a: m u e s t r a c óm o d e b e r í a n c a m b i a r los e s t a d o s ,
c o m e n z a n d o d e s d e el inicial h a s t a l l e g a r a l f i n a l
E s t a d o s : e s p e c i f i c a l a fo r m a d e c a d a e s t a d o e n fo r m a d e t u p l a , a d e m á s ,
s e m u e s t r a c u á l e s el i nv a r i a n t e d e e s t a d o
E s t a d o i ni ci al : m u e s t r a los val ores q u e f o r m a n el e s t a d o inicial
E s t a d o f i n a l : m u e s t r a los val ores q u e f o r m a n el e s t a d o f i n a l
Transformación d e e s t a d o s : d e m a n e r a formal e s p e c i f i c a c ó m o s e
re al i z an , e n términos g e n e r a l e s , los c a m b i o s d e u n e s t a d o a l s i g u i e n t e
Co m p u tac i ó n iterativa
¿ Q u é e s d e mo s t ra r correctitud d e u n a l go r i t m o ?
Un algoritmo e s correcto con respecto a
u n a especificación
S e r á correcto si p a r a c a d a e n t r a d a q u e c u m p l e l a s
precondiciones, el algoritmo t e r m i n a c u m p l i e n d o l a
poscondición
A d e m á s , p a r a el c a s o e s p e c í f i c o d e a l go r i t m o s
iterativos, s e c u e n t a co n u n m é t o d o fo r m a l d e probar
l a correctitud
Co m p u tac i ó n iterativa
E s p e c i f i c a c i ó n p a r a el cá lcu lo d e factorial
Entrada: N ³0
Un e s p e c i f i c a c i ó n e s l a definición d e u n p ro b l e m a e n
términos d e s u precondición Q y poscondición R
S e d e n o t a c o m o { Q } A { R } . “A e s correcto con
respecto a l a precondición Q y a l a poscondición R”
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e factorial
Factorial(int N ) {
int i n d i c e = 0 ;
E s t a d o inicial
int re s u l t a d o = 1 ;
while ! ( i n d i c e = = N ) {
indice=indice + 1 ;
resultado= resultado * indice;
}
System.out.println(resultado);
}
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e factorial
Factorial(int N ) {
¿Es correcto el
int i n d i c e = 0 ;
algoritmo con
int re s u l t a d o = 1 ; resp e cto a la
e specificación?
while ! ( i n d i c e = = N ) {
indice=indice + 1 ;
re s u l t a d o = resultado * i n d i c e ;
}
System.out.println(resultado);
}
Co m p u tac i ó n iterativa
E s p e c i f i c a c i ó n p a r a el c á l c u l o d e raiz d e X
E n t r a d a : X £ 0^ X Î R^ d >0
S a l i d a : atal q u e |a 2 -X| £ d
I d e a : Dado X, inicie l a ap rox i m a c i ó n d e a co n el valor 1 . 0 y
mejorela utilizando el c a m b i o d e a por (a +X/a)/2
(1, 1 . 0 ) ® (2, (1.0+x/1.0)/2) ® …® (N,a)
E s t a d o s : Tupla d e l a fo r m a (índice , aproximación) tal q u e
a > 0 (Invariante)
E s t a d o s inicial: a = 1 . 0
E s t a d o f i n a l : a t a l q u e |a2-X| £ d
Transformación d e e s t a d o s : (índice , a ) ( i n d i c e + 1 ,
(a+X/2)/2)
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e raiz d e X
raizIterativa(double X, d o u b l e d e l t a ) {
double a = 1 . 0 ;
while ( ! ( M a t h . a b s ( a * a - X ) < = d e l t a ) ) {
a = ( a + X/a)/2.0;
}
System.out.println(a);
}
Co m p u tac i ó n iterativa
I de n t ifi que e n los a l go r i t m o s Factorial(int N) y
raizIterativa(double X, d o u b l e d e l t a ) los e s t a d o s inicial
y f i n a l , a s i c o m o l a t ra n s fo rma ció n d a d a e n l a
especificación
¿ C ó mo s e m a n e j a n l a s co n d icio n e s d e e n t r a d a e n el
a l go r i t m o ?
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e factorial
Factorial(int N ) {
int i n d i c e = 0 ;
Condiciones iniciales
int re s u l t a d o = 1 ;
while ! ( i n d i c e = = N ) {
indice=indice + 1 ;
resultado= resultado * indice;
}
System.out.println(resultado);
}
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e factorial
Factorial(int N ) {
Transformación d e e s t a d o s :
int i n d i c e = 0 ; (í ndi ce , resultado) ® (í ndi ce +1,
re s u l t a d o * ( í n d i c e +1 ) )
int re s u l t a d o = 1 ;
Estado
inicial
while ! ( i n d i c e = = N ) {
indice=indice + 1 ;
re s u l t a d o = resultado * i n d i c e ;
}
System.out.println(resultado);
}
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e raiz d e X
raizIterativa(double X, d o u b l e d e l t a ) {
while ( ! ( M a t h . a b s ( a * a - X ) < = d e l t a ) ) {
a = ( a + X/a)/2.0;
}
System.out.println(a);
}
Co m p u tac i ó n iterativa
Algoritmo p a r a el cá lcu lo d e raiz d e X
raizIterativa(double X, d o u b l e d e l t a ) {
double a = 1 . 0 ;
while ( ! ( M a t h . a b s ( a * a - X ) < = d e l t a ) ) {
Transformación d e e s t a d o s :
a = ( a + X/a)/2.0; (í ndi ce , a ) ( i n d i c e + 1 ,
(a+X/2)/2)
}
System.out.println(a);
}
Co m p u tac i ó n iterativa
El e s q u e m a d e u n algoritmo iterativo e s el s i g u i e n t e :
E s t a d o inicial
S¬S0
while ! isFinal(S) do Iterador : El c u a l v a transformar
los e s t a d o s y p a r a s e t e n g a el
S ¬ Tr a n s fo rm (S ) e s t a d o f i n al
Co m p u tac i ó n iterativa
Cómo probar q u e u n algoritmo iterativo A e s
correcto co n respecto a u n e s p e c i f i c a c i ó n
(precondición Q, poscondición R)
1. Inicialización: P r u e b e q u e el e s t a d o inicial S 0 c u m p l e
el i nv a r i a n t e
2 . I n v a r i a n z a : P r u e b a q u e l a t ra n s fo rma ció n c o n s e r v a
el i nv a r i a n t e
3. Éxito: S i S e s u n e s t a d o f i n a l ^ s e c u m p l e el
i nv a r i a n t e P ® R
4. Terminación: A t e r m i n a
Co m p u tac i ó n iterativa
C o m p u t a (int A, int B ) {
1) ¿Como p u e d o describir
int r e s = 0 , i = 1 ; los e s t a d o e n e s t e a l go r i t m o ?
while ( i < = B ) {
i=i+1; 2) ¿Como e s el e s t a d o i n i c i al ?
re s = re s + A;
} 3) ¿Como c a m b i a n los e s t a d o s
a m e d i d a q u e itera (transforma-
System.out.println(res); ción d e e s t a d o s ) ?
Qué c a l c u l a C o m p u t a ( 2 , 3 ) ?
Co m p u tac i ó n iterativa
Probar correctitud
1 . Inicialización:Pruebe que el estado inicial S 0 cumple
el invariante
El e s t a d o inicial e s (1,0), S e ve rif ica q u e s e c u m p l a
el i nv a r i a n t e , s e t i e n e q u e i = 1 .
Co m p u tac i ó n iterativa
S e c o n s i d e r a q u e a n t e s d e entrar el ciclo, i = k y s e
prueba.
Si i=k, res=∑ A
Co m p u tac i ó n iterativa
C o m p u t a (int A, int B ) {
int r e s = 0 , i = 1 ;
while ( i < = B ) {
i=i+1;
re s = re s + A;
}
System.out.println(res);
}
Algoritmos en la computación
Calcule el tiempo Instrucción Costo
de computo para el
algoritmo
1 iß 1 c1
9 i ß 2i c9
Algoritmos en la computación
Diseño de algoritmos
• Solución ingenua
• Dividir y conquistar
• Programación dinámica
• Técnicas voraces
Referencias
Próximo tema:
Computación iterativa:
Concepto de estado
Transición de estados
Invariante de ciclo
Formando líderes para la
construcción de un nuevo país en
paz