func ack(m, n) : integer - Universidad de Carabobo

Anuncio
Algoritmos y Programación II
FACYT – Universidad de Carabobo
Solución de la Prueba Diagnóstica
Respuesta pregunta 1
Implementación
func ack(m, n) : integer
begin
if m = 0
return n + 1;
else
if n = 0
return ack(m-1, 1);
else
return ack(m-1, ack(m, n-1));
endif
endif
end
Corrida
A(2,2)
A(1, A(2,
A(1, A(1,
A(1, A(1,
A(1, A(1,
A(1, A(1,
A(1, A(1,
A(1, A(1,
A(1, A(0,
A(1, A(0,
A(1, A(0,
A(1, A(0,
A(1, A(0,
A(1, A(0,
A(1, A(0,
A(1, 5)
A(0, A(1,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, A(0,
A(0, 6)
7
1))
A(2,
A(1,
A(0,
A(0,
A(0,
3))
A(1,
A(0,
A(0,
A(0,
A(0,
A(0,
4))
4))
A(1,
A(0,
A(0,
A(0,
A(0,
A(0,
A(0,
A(0,
5))
0)))
1)))
A(1, 0))))
A(0, 1))))
2)))
2)))
A(1,
A(0,
A(0,
A(0,
3)))
1))))
A(1, 0)))))
A(0, 1)))))
2))))
3)))
A(1,
A(0,
A(0,
A(0,
A(0,
A(0,
4)))
2))))
A(1, 1)))))
A(0, A(1, 0))))))
A(0, A(0, 1))))))
A(0, 2)))))
3))))
2005/2006
Algoritmos y Programación II
FACYT – Universidad de Carabobo
2005/2006
Respuesta pregunta 2
¦ proc p1 (in a : integer)
¦ begin
¦
if a > 0 then
¦
begin
¦
writeln( a );
¦
p1( a - 1 );
¦
end
¦
else
¦
writeln ( 'Fin' )
¦
endif;
¦ end
Salida de este programa
para a = 6:
6
5
4
3
2
1
Fin
Al añadir las siguientes dos ultimas instrucciones a p1:
proc p1 (in a : integer)
¦ begin
¦
if a > 0 then
¦
begin
¦
writeln( a );
¦
p1( a - 1 );
¦
end
¦
else
¦
writeln ( 'Fin' )
¦
endif;
¦
writeln ( a );
¦
writeln ('Fin de verdad');
¦ end
Salida de este programa
para a = 6:
6
5
4
3
2
1
Fin
0
Fin
1
Fin
2
Fin
3
Fin
4
Fin
5
Fin
6
Fin
de verdad
de verdad
de verdad
de verdad
de verdad
de verdad
de verdad
Algoritmos y Programación II
FACYT – Universidad de Carabobo
2005/2006
Respuesta pregunta 3
Sintaxis
Crear:
Asignar:
Numerador:
Denominador:
Sumar:
Restar:
Multiplicar:
Dividir:
Racional x Entero x Entero
Racional
Racional
Racional x Racional
Racional x Racional
Racional x Racional
Racional x Racional
Æ
Æ
Æ
Æ
Æ
Æ
Æ
Æ
Racional
Racional
Entero
Entero
Racional
Racional
Racional
Racional
Especificación Operacional
{Pre: }
Func crear() : Racional;
⎧p
⎫
/ p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ ; p = 0, q = 1;}
⎩q
⎭
{Post: crear Å Q = ⎨
{Pre: ∃b ∈ Ζ / b ≠ 0 }
Func asignar(in r : Racional; in a, b : integer) : Racional;
⎧p
⎫
/ p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ ; p = a, q = b;}
⎩q
⎭
{Post: crear Å Q = ⎨
{Pre: }
Func numerador(in r : Racional) : integer;
⎧p
⎫
/ p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ }
⎩q
⎭
{Post: crear Å p; Q = ⎨
{Pre: }
Func denominador(in r : Racional) : integer;
⎧p
⎫
/ p ∈ Ζ, q ∈ Ζ, q ≠ 0⎬ }
⎩q
⎭
{Post: crear Å q; Q = ⎨
{Pre: }
Func sumar(in r1, r2 : Racional) : Racional;
{Post: crear Å r1 + r2; ∀r1, r 2 ∈ Q / r1 =
p1 + p 2
p1
p2
}
, r2 =
, r1 + r 2 =
q1
q2
q1 + q 2
{Pre: }
Func restar(in r1, r2 : Racional) : Racional;
{Post: crear Å r1 - r2; ∀r1, r 2 ∈ Q / r1 =
p1
p2
p1 − p 2
, r2 =
, r1 − r 2 =
}
q1
q2
q1 − q 2
{Pre: }
Func multiplicar(in r1, r2 : Racional) : Racional;
{Post: crear Å r1 * r2; ∀r1, r 2 ∈ Q / r1 =
p1
p2
p1 * p 2
}
, r2 =
, r1 * r 2 =
q1
q2
q1 * q 2
{Pre: }
Func dividir(in r1, r2 : Racional) : Racional;
{Post: crear Å r1 / r2; ∀r1, r 2 ∈ Q / r1 =
p1
p 2 r1 p1 * q 2
}
, r2 =
,
=
q1
q 2 r 2 q1 * p 2
Algoritmos y Programación II
FACYT – Universidad de Carabobo
2005/2006
Register Racional
Numerador
: integer;
Denominador : integer;
End register
Func multiplicar(in r1, r2 : Racional) : Racional;
begin
aux : integer;
out : Racional;
aux Å MCD(r1.numerador * r2.numerador, r1.denominador * r2.denominador);
out.numerador Å (r1.numerador * r2.numerador)/aux;
out.denominador Å (r1.denominador * r2.denominador)/aux;
return out;
end
Func dividir(in r1, r2 : Racional) : Racional;
begin
aux : integer;
out : Racional;
aux Å MCD(r1.numerador * r2.denominador, r1.denominador * r2.numerador);
out.numerador Å (r1.numerador * r2.denominador)/aux;
out.denominador Å (r1.denominador * r2.numerador)/aux;
return out;
end
Func MCD(in m, n : intenger)
begin
rem : integer;
while(n ≠ 0) do
begin
rem Å m mod n;
m Å n;
n Å rem;
end
return m;
end
Descargar