Programación II (12407) Curso 2007

Anuncio
Programación II (12407)
Curso 2007-2008, Examen Final
Tiempo total: 2 horas 30 minutos
Profesor: Anders Jonsson
Publicación notas: 1-4-2008
Revisión examen: 2-4-2008 15:00, 399 (Anders)
Revisión prácticas: 27-3-2008 15:30, 302 (Kaushik), 336 (Jaume)
1. (20%) Escribir una función recursiva que devuelva el menor de los elementos de un
vector de números reales. Por ejemplo, si el vector es [3,5; 12,3; 2,6; 16,1; 23,4; 7,7] la
función debe devolver 2,6.
Solución:
1
2
3
4
5
6
7
8
9
10
11
12
13
funcion Menor (V: vector de natural , p : natural ) devuelve rea l ;
variable min : rea l ;
s i ( p=1) entonces
devuelve V [ 1 ] ;
sino
min ← Menor (V, p−1) ;
s i ( min < V[ p ] ) entonces
devuelve min ;
sino
devuelve V[ p ] ;
fsi
fsi
ffuncion
2. (25%) El tema de las prácticas ha sido implementar un programa que juega Fútbol en
Papel. La posición del balón está representada por un número natural. Ahora se supone
que se dispone de las siguientes funciones:
TurnoExtra(p:natural): devuelve cierto si el jugador actual tiene un turno extra en
la posición p, devuelve falso en caso contrario.
Distancia(p:natural): devuelve un número real que representa la distancia desde la
posición p a la porterı́a opuesta.
Vecinas(p:natural): devuelve un vector de números naturales que representa las
posiciones adyacentes a donde se puede mover el balón desde la posición p.
También se dispone de una función Longitud(V:vector) que devuelve el número de
elementos de cualquier vector V.
Escribir una función recursiva que determine todas las posiciones que se pueden alcanzar
desde la posición actual (incluso las que requieren turnos extra para llegar) y que devuelva
12407 - Programación II
Página 1 de 5
26 Marzo 2008
Convocatoria Marzo
Curso 2007-2008
Segundo Trimestre
la distancia mı́nima a la porterı́a opuesta desde cualquiera de estas posiciones. Si se
considera útil, se puede usar la función desarrollada en la pregunta 1.
Solución:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
funcion Dis tan ciaMin im a ( p : natural ) devuelve rea l
variable i : natural ;
variable min , d i s t : rea l ;
variable v e c i n a s : vector de natural ;
s i no( TurnoExtra ( p ) ) entonces
devuelve D i s t a n c i a ( p ) ;
sino
v e c i n a s ← Vecin as ( p ) ;
min ← Dis tan ciaMin im a ( v e c i n a s [ 1 ] ) ;
para i ← 2 hasta L on gitu d ( v e c i n a s ) hacer
d i s t ← Dis tan ciaMin im a ( v e c i n a s [ i ] ) ;
s i ( d i s t < min ) entonces
min ← d i s t ;
fsi ;
fpara
devuelve min ;
fsi
ffuncion
Otra posibilidad es aprovechar la función Menor de la pregunta 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
funcion Dis tan ciaMin im a ( p : natural ) devuelve rea l
variable i : natural ;
variable v e c i n a s : vector de natural ;
variable d i s t : vector de rea l ;
s i no( TurnoExtra ( p ) ) entonces
devuelve D i s t a n c i a ( p ) ;
sino
v e c i n a s ← Vecin as ( p ) ;
para i ← 1 hasta L on gitu d ( v e c i n a s ) hacer
d i s t [ i ] ← Dis tan ciaMin im a ( v e c i n a s [ i ] ) ;
fpara
devuelve Menor ( d i s t , L on gitu d ( d i s t ) ) ;
fsi
ffuncion
12407 - Programación II
Página 2 de 5
26 Marzo 2008
Convocatoria Marzo
Curso 2007-2008
Segundo Trimestre
3. (25%) Considera la siguiente función:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
funcion F(m, n : natural ) devuelve natural
variable i , r e s : natural ;
i ← 1;
res ← 1;
mientras ( i ≤ m) hacer
res ← res ∗ i ;
i ← i + 1;
fmientras
s i ( n = 0)
devuelve r e s ;
sino
devuelve r e s + F(m, n−1) ;
fsi
ffuncion
(a) (20%) ¿Cuál es el resultado de la llamada F(4,4)?
(b) (80%) Analiza la complejidad de la función F.
Solución:
(a) Para un valor determinado de m, la variable res tendrá el valor m! después del
bucle. Por lo tanto, cada llamada recursiva agrega 4! = 24 al resultado final.
Hay una llamada recursiva para cada valor de n en el rango [0, 4], es decir, hay
5 llamadas recursivas. Ası́, el resultado de F(4,4) es 5 ∗ 24 = 120.
(b) El bucle corre exactamente m veces. Cada vez que se repite el bucle se realiza
un número constante c1 de operaciones elementales. Fuera del bucle se realizan
solamente operaciones elementales, cuyo número es diferente en el caso base y
en el caso recursivo. Llamamos c2 al número constante de operaciones en el caso
base, y c3 al número de operaciones en el caso recursivo. El tiempo de ejecución
T (m, n) depende tanto de m como de n. Se deduce la siguiente ecuación de
recurrencia:
c1 m + c2 , si n = 0,
T (m, n) =
c1 m + c3 + T (m, n − 1), si n > 0.
12407 - Programación II
Página 3 de 5
26 Marzo 2008
Convocatoria Marzo
Curso 2007-2008
Segundo Trimestre
Si expandimos la expresión para T (m, n) en el caso recursivo obtendremos
T (m, n) =
=
=
=
=
=
=
c1 m + c3 + T (m, n − 1) =
c1 m + c3 + c1 m + c3 + T (m, n − 2) =
2(c1 m + c3 ) + T (m, n − 2) =
3(c1 m + c3 ) + T (m, n − 3) = . . . =
k(c1 m + c3 ) + T (m, n − k) = {k = n} =
n(c1 m + c3 ) + T (m, 0) = n(c1 m + c3 ) + c1 m + c2 =
c1 mn + c3 n + c1 m + c2 = O(mn)
La complejidad de la función F en notación asintótica es O(mn).
4. (30%) El idioma pirata, o Rövarspråket, consiste en duplicar todas las consonantes y
poner una ‘o’ en el medio. Por lo tanto, una ‘p’ se convierte en ‘pop’, y ”Pirata a bordo”
en idioma pirata serı́a ”Popiroratota a boborordodo”. Escribir una función que tome
como entrada un texto acabado en punto y devuelva el texto traducido en idioma pirata.
Se supone que el texto sólo contiene letras, espacios y el punto final.
El objectivo no sólo es escribir un algoritmo correcto, sino también aplicar diseño descendente para que el algoritmo sea bien estructurado. Además, tanto el texto como su
traducción deben estar representados por secuencias de caracteres, no por vectores. Se
dispone de las siguientes funciones para manipular secuencias:
LeerPrimerElemento(S, e) guarda el primer elemento (por ejemplo un carácter) de
la secuencia S en la variable e.
LeerSiguienteElemento(S, e) guarda el siguiente elemento de la secuencia S en la
variable e.
UltimoElemento(S) devuelve cierto si se ha llegado al final de la secuencia S y falso
en caso contrario.
InicializarSecuencia(T) hace que se pueda escribir elementos en la secuencia T , que
inicialmente está vacı́a.
EscribirElemento(T, e) escribe el elemento e al final de la secuencia T .
12407 - Programación II
Página 4 de 5
26 Marzo 2008
Convocatoria Marzo
Curso 2007-2008
Segundo Trimestre
Solución:
1
2
3
4
5
6
7
8
9
10
11
12
funcion P i r a t a ( S : secuencia de caracter ) devuelve secuencia
variable c : caracter ;
variable T : secuencia de caracter ;
I nicia liza rSecu enc i a (T) ;
LeerPrimerElemento ( S , c ) ;
mientras ( c 6= ’.’ ) hacer
AgregarElemento (T, c ) ;
LeerSiguienteElemento ( S , c ) ;
fmientras
EscribirElemento (T, c ) ;
devuelve T ;
ffuncion
13
14
15
16
17
18
19
20
accion AgregarElemento (T : secuencia de caracter , c : caracter )
EscribirElemento (T, c ) ;
s i ( c 6= ’ ’ ) y no( EsVocal ( c ) ) entonces
EscribirElemento (T, ’o’ ) ;
EscribirElemento (T, c ) ;
fsi
faccion
21
22
23
24
25
26
27
funcion EsVocal ( c : caracter ) devuelve booleano
variable min , may : booleano ;
min ← ( c=’a’ ) o ( c=’e’ ) o ( c=’i’ ) o ( c=’o’ ) o ( c=’u’ ) ;
may ← ( c=’A’ ) o ( c=’E’ ) o ( c=’I’ ) o ( c=’O’ ) o ( c=’U’ ) ;
devuelve ( min o may) ;
ffuncion
12407 - Programación II
Página 5 de 5
26 Marzo 2008
Descargar