Sei sulla pagina 1di 14

Diseo iterativo y Correccin de programas n o

Orlando Arboleda Molina Juan Francisco D az

5 de septiembre de 2005

Contenido 1. Computacin iterativa o 2. Correctitud 3. Invariantes de ciclo

1.

Computacin iterativa o Una computacin iterativa es aquella que durante su ejecucin, utio o liza espacio adicional constante, sin importar la duracin de la como putacin. o Una computacin iterativa se caracteriza por comenzar en un estado o inicial S0 , y transformar ese estado en un conjunto de estados intermedios hasta llegar a un estado nal Sf S0 S 1 S 2 . . . S f Todo estado debe caracterizarse por una condicin que siempre se o cumple y que se denomina Invariante. Tanto el estado inicial, como los intermedios, como el nal siempre cumplen esa condicin. o

Ejemplo1:* Clculo de Factorial a 1. Entrada:N 0 2. Salida: resultado = N ! 3. Idea: Iteracin ascendente: o (0, 1) (1, 1) (2, 2) (3, 6) . . . (N, N !) 4. Estado: Tupla de la forma (indice, resultado) tal que indice N resultado = indice! (Invariante) 5. Estado Inicial: indice = 0, resultado = 1 6. Estado Final indice = N 7. Transformacin de estados: o (indice, resultado) (indice + 1, (indice + 1) resultado)

8. Algoritmo: FactorialAsc(int N) { int indice=0; int resultado=1; (almacenar el factorial) a while !(indice = N ) { indice = indice + 1; resultado = indice resultado; } System.out.println(resultado); }

Es correcto con respecto a su especicacin? o

Ejemplo2:* Clculo de Factorial a 1. Entrada:N 0 2. Salida: resultado = N ! 3. Idea: Iteracin descendente: o (N, N ) (N 1, N (N 1)) (N 2, N (N 1)(N 2)) . . . (1, N !) 4. Estado: Tupla de la forma (indice, resultado) tal que indice 1 resultado = N (N 1) (N 2) . . . (indice) (Invariante) 5. Estado Inicial: indice = N, resultado = N 6. Estado Final indice = 1 7. Transformacin de estados: o (indice, resultado) (indice 1, resultado (indice 1))

8. Algoritmo: FactorialDesc(int N) { int indice=N; int resultado=N; (almacenar el factorial) a while !(indice = 1) { indice = indice-1; resultado = indice*resultado; } System.out.println(result); }

Es correcto con respecto a su especicacin? o

En general el esquema de un algoritmo iterativo es el siguiente: S S0 While ! IsFinal(S) do S T ransf orm(S)

Ejemplo3:* Ra cuadrada z 1. Entrada:X 0 X R > 0 2. Salida: a : |a2 X| 3. Idea: Mtodo de newton: Dado un real X empiece con una adivie nanza a de la ra de X e iterativamente mejore a hasta que sea z sucientemente buena. Cmo mejorar a? o a = (a + X/a)/2 X > a X ssi a = X

a 4. Estado: a > 0

5. Estado Inicial: a = 1,0 6. Estado Final a : |a2 X|

7. Algoritmo: raizIterativa (double X, double delta) { double a=1.0; while ( !(Math.abs(X-a*a)/X)<=delta ) { a = (a + X/a)/2.0; } System.out.println(a); }

Es correcto con respecto a su especicacin? o

2.

Correccin o

Una especicacin es la denicin de un problema en trminos de sus o o e condiciones de entrada precondicin y sus condiciones de salida posto condicin o Un algoritmo A es correcto con respecto a una especicacin (Q la o precondicin y R la postcondicin)si para cada conjunto de valores de o o entrada que cumplen la precondicin, los valores de salida producidos o cumplen la postcondicin. Se notar: {Q}A{R} o a Dada una especicacin (Q la precondicin y R la postcondicin) y un o o o algoritmo iterativo A de la forma: S S0 While ! IsFinal(S) do S T ransf orm(S) con P como condicin invariante, se puede concluir que {Q}A{R} si o y solo si: 1. Inicializacin {Q}S S0 {P}, es decir S0 cumple el invariante. o 2. Invarianza {P}S T ransf orm(S) {P}, es decir la transformacin o conserva el invariante. 3. Exito P S es nal = R 4. Terminacin A termina o Aplicar a los ejemplos anteriores

Ejemplo4: Considere el siguiente algoritmo: Computa(int A,int B) { 1 int res, i; 2 res=0; 3 i=1; 4 while ( i <= B ){ 5 i=i+1; 6 res=res+A; 7 } 8 System.out.println(res); 9} Si {Q: A, B R B > 0}, {R: res = A B} y i1 {P: res = p=1 A} es el invariante del ciclo, se tiene que {Q} Computa {R} ? Aplicando los pasos para vericar que un programa iterativo es correcto tenemos:

10

1. Inicializacin: Antes de ingresar al ciclo tenemos que i = 1. Aplio cando el invariante de ciclo tenemos que: res =
i1 p=1 A

11 p=1 A

0 p=1 A

= 0 valor de res (lnea 2)

2. Invarianza: Al inicio de la iteracin i = k o


k1

res =
p=1

Al ejecutar esta iteracin se tiene: o


k1 k

res = res + A =
p=1

A+A=
p=1

A (linea 6)

e i = k + 1 (linea 5) Luego el invariante de ciclo se mantiene 3. Exito: El ciclo naliza cuando i = B + 1. Como el invariante es cierto se da que: (B+1)1 i1 A= B A=A B 1=AB res = p=1 A = p=1 p=1 p=1 4. Terminacin: En cada paso la diferencia entre B e i disminuye, o luego en algn momento nito i > B. u Conclusin: {Q} Computa {R} o

11

Ejemplo5:* Indicar pre y poscondicin tal que Computa3 sea correcto o con respecto a esa especicacin y se enuncie lo que se caclula en A. o Computa3(int N) { 1 int A,B,i,j; 2 A=0; 3 i=1; 4 while ( i <= N ){ 5 B=1; 6 j=1; 7 while ( j <= 3 ){ 8 B=B*i; 9 j++; 10 } 11 A=A+B; 12 i++; 12 } 14 System.out.println(.A=+A); 15 } Invariante de ciclo: A =
i1 3 p=1 p

12

Ejemplo6:* Indicar pre y poscondicin tal que Opera sea correcto con o respecto a esa especicacin y se enuncie lo que se caclula en D. o Opera(int B, int N) { 1 int A, C, D; 2 3 4 5 6 7 8 9 10 11 D=0; A=1; C=N; while ( C >= 1 ){ A=A*B; D=D+A; C; } System.out.println(D=+D); }

Nota: En este caso la variable que controla el ciclo(C) es decreciente Invariante de ciclo: D = N C B p . (donde A = B N C ) p=1

Ejemplo7: El procedimiento Opera sigue siendo correcto para computar N B p si se intercambian las lineas 6 y 7 ? p=1

13

Ejemplo8: A partir del procedimiento indicado a continuacin, que tiene o como entrada un arreglo A indexado de la forma [1..n]. Indicar: 1. Invariante de ciclo para el iterador interno (linea 3) 2. Invariante de ciclo para el iterador externo (linea 2) 3. Que calcula ? void BS(int A[], int N) { 1 int i, j, aux; 2 for ( i=1; i < N ; i++) 3 for ( j=N; j > i ; j) 4 if ( A[j] < A[j 1] ){ 5 aux=A[j]; 6 A[j]=A[j-1]; 7 A[j-1]=aux; 8 } 9}

14

Potrebbero piacerti anche