Solución

Anuncio
Programación II (12407)
Curso 2007-2008, Examen Septiembre
Tiempo total: 2 horas
Profesor: Anders Jonsson
Publicación notas: 10-9-2008
Revisión examen: 12-9-2008 14:00, despacho 399
1. (30%) Estás jugando un juego que funciona de la siguiente manera. Empiezas con el
número 1. Desde 1, tienes dos opciones. Puedes mover al número 2, o puedes saltar un
número y mover directamente al número 3. Del mismo modo, desde 2 puedes mover a 3
o a 4, etc.
Cada vez que mueves desde un número i a i + 1 obtienes i puntos. Cada vez que mueves
desde i a i + 2 obtienes i(i − 1) puntos.
Escribe una función recursiva que calcule el puntaje máximo que se puede obtener si el
último número es n. Por ejemplo, si n = 6, la mejor solución es mover del número 1 a
2, de 2 a 3, de 3 a 4, y finalmente de 4 a 6. El puntaje total será 1 + 2 + 3 + 4 ∗ 3 = 18
puntos.
Solución: (2 alternativas)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
funcion PuntajeMaximo ( n : natural ) devuelve natural
variable a , b : natural ;
s i ( n <= 1)
devuelve 0 ;
sino
a ← ( n−2) ∗( n−3) + PuntajeMaximo ( n−2) ;
b ← ( n−1) + PuntajeMaximo ( n−1) ;
si (a > b)
devuelve a ;
sino
devuelve b ;
fsi
fsi
ffuncion
funcion PuntajeMaximo ( n : natural ) devuelve natural
s i ( n = 1)
devuelve 0 ;
sino s i ( n <= 5)
devuelve ( n−1) + PuntajeMaximo ( n−1) ;
sino
devuelve ( n−2) ∗( n−3) + PuntajeMaximo ( n−2) ;
fsi
ffuncion
12407 - Programación II
Página 1 de 4
10 Septiembre 2008
Convocatoria Septiembre
Curso 2007-2008
Septiembre
2. (30%) Considera la siguiente función:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
funcion F( n : natural , V: vector de natural ) devuelve natural
variable i ,m: natural ;
variable V1 , V2 : vector de natural ;
s i ( n = 1)
devuelve V [ 1 ] ;
sino
i ← 1;
m ← n div 2 ;
mientras ( i <= m)
V1 [ i ] ← V[ i ] ;
i ← i + 1;
fmientras
mientras ( i <= n )
V2 [ i − m] ← V[ i ] ;
i ← i + 1;
fmientras
devuelve F(m, V1) + F( n − m, V2 ) ;
fsi
ffuncion
(a) (30%) ¿Cuál es el resultado de la llamada F(4, [2, 5, 4, 7])?
(b) (70%) Analiza la complejidad de la función F.
Solución:
(a) Para F(4, [2, 5, 4, 7]), el valor de n es mayor que 1, por lo que entramos en el
caso recursivo. Al final del bucle, m es igual a 2, por lo que V1 será [2, 5] y V2
será [4, 7]. Se devuelve F(2, [2, 5])+F(2, [4, 7]).
Para F(2, [2, 5]), n sigue siendo mayor que 1. Esta vez, m será 1, V1 será [2] y
V2 será [5]. Se devuelve F(1, [2])+F(1, [5]).
Para F(1, [2]), n es igual a 1, por lo que se devuelve 2. Del mismo modo, F(1, [5])
devuelve 5, por lo que F(2, [2, 5]) devuelve 2 + 5 = 7.
Si observamos que el resultado siempre es la suma de todos los elementos del
vector, es fácil deducir que el resultado de F(4, [2, 5, 4, 7]) es 2 + 5 + 4 + 7 = 18.
(b) El tiempo de ejecución sólo depende de n, por lo que buscamos una expresión
para T (n). En el caso base, se realizan un número constante de operaciones.
En el caso recursivo, hay un número constante de operaciones, más dos bucles
que corren un total de n veces. Además, se llama recursivamente a la función
dos veces, ambas veces con un parámetro proporcional a n/2. Obtenemos la
siguiente equación de recurrencia:
c1 , si n = 1,
T (n) =
c2 + c3 n + 2T (n/2), si n > 1.
12407 - Programación II
Página 2 de 4
10 Septiembre 2008
Convocatoria Septiembre
Curso 2007-2008
Septiembre
Si expandimos la expresión para T (n) en el caso recursivo obtenemos
T (n) =
=
=
=
=
c2 + c3 n + 2T (n/2) = c2 + c3 n + 2(c2 + c3 n/2 + 2T (n/4)) =
3c2 + 2c3 n + 4T (n/4) = 3c2 + 2c3 n + 4(c2 + c3 n/4 + 2T (n/8)) =
7c2 + 3c3 n + 8T (n/8) = . . . = (2k − 1)c2 + kc3 n + 2k T (n/2k ) =
{k = log n} = c2 (n − 1) + c3 n log n + nT (1) = {T (1) = c1 } =
−c2 + (c1 + c2 )n + c3 n log n = O(n log n)
La complejidad de la función F en notación asintótica es O(n log n).
3. (40%) El Ministerio del Interior de Suecia te ha contratado para una tarea bien particular. Dispones de un archivo con las edades de toda la gente en Suecia. El ministerio
quiere saber cual es la edad promedia de la gente cuya edad es par. Del mismo modo,
quiere saber cual es la edad promedia de la gente cuya edad es impar. Por ejemplo, si
hay tres personas con las edades 5, 6 y 8 años, la edad promedia de la gente con edad
par es (6 + 8)/2 = 7 años, y la edad promedia de la gente con edad impar es 5/1 = 5
años. Escribe un algoritmo para obtener la información requerida.
El objetivo no sólo es escribir un algoritmo correcto, sino también aplicar diseño descendente para que el algoritmo sea bien estructurado. Además, el archivo de edades
tiene que ser representado por una secuencia de números enteros, no por un vector. La
secuencia de edades termina con el valor −1. Se dispone de las siguientes funciones para
manipular secuencias:
LeerPrimerElemento(S, e) guarda el primer elemento (por ejemplo un número entero) 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 3 de 4
10 Septiembre 2008
Convocatoria Septiembre
Curso 2007-2008
Septiembre
Solución:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
accion EdadPromedia ( S : secuencia de natural )
variable e : natural ;
variable P , I : secuencia de natural ;
I nicia liza rSecu enc i a (P) ;
I nicia liza rSecu enc i a ( I ) ;
LeerPrimerElemento ( S , e ) ;
mientras ( e >= 0)
Agregar (P , I , e ) ;
LeerSiguienteElemento ( S , e ) ;
fmientras
EscribirElemento (P, −1) ;
EscribirElemento ( I , −1) ;
Mostrar ( "El promedio de edades par es " + Promedio (P) ) ;
Mostrar ( "El promedio de edades impar es " + Promedio ( I ) ) ;
faccion
16
17
18
19
20
21
22
23
accion Agregar (P , I : secuencia de natural , e : natural )
s i ( e mod 2 = 0)
EscribirElemento (P , e ) ;
sino
EscribirElemento ( I , e ) ;
fsi
faccion
24
25
26
27
28
29
30
31
32
33
34
35
36
funcion Promedio ( S : secuencia de natural ) devuelve rea l
variable e , n , suma : natural ;
n ← 0;
suma ← 0 ;
LeerPrimerElemento ( S , e ) ;
mientras ( e >= 0)
n ← n + 1;
suma ← suma + e ;
LeerSiguienteElemento ( S , e ) ;
fmientras
devuelve suma/n ;
ffuncion
12407 - Programación II
Página 4 de 4
10 Septiembre 2008
Descargar