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