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