I1M2012: Comentario del 3º examen de la evaluación continua
En la clase de hoy de Informática de 1º del Grado en Matemáticas se ha comentado el 3º examen de la evaluación continua.
A continuación se muestra el examen junto con su solución:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
-- Informática (1º del Grado en Matemáticas) -- 3º examen de evaluación continua (6 de febrero de 2013) -- --------------------------------------------------------------------- -- --------------------------------------------------------------------- -- Ejercicio 1.1. Definir, por recursión, la función -- sumaR :: Num a => [[a]] -> a -- tal que (sumaR xss) es la suma de todos los elementos de todas las -- listas de xss. Por ejemplo, -- sumaR [[1,3,5],[2,4,1],[3,7,9]] == 35 -- --------------------------------------------------------------------- sumaR :: Num a => [[a]] -> a sumaR [] = 0 sumaR (xs:xss) = sum xs + sumaR xss -- --------------------------------------------------------------------- -- Ejercicio 1.2. Definir, por plegado, la función -- sumaP :: Num a => [[a]] -> a -- tal que (sumaP xss) es la suma de todos los elementos de todas las -- listas de xss. Por ejemplo, -- sumaP [[1,3,5],[2,4,1],[3,7,9]] == 35 -- --------------------------------------------------------------------- sumaP :: Num a => [[a]] -> a sumaP = foldr (\x y -> (sum x) + y) 0 -- --------------------------------------------------------------------- -- Ejercicio 2. Definir la función -- raicesEnteras :: Int -> Int -> Int -> [Int] -- tal que (raicesEnteras a b c) es la lista de las raices enteras de la -- ecuación ax^2+bx+c = 0. Por ejemplo, -- raicesEnteras 1 (-6) 9 == [3] -- raicesEnteras 1 (-6) 0 == [0,6] -- raicesEnteras 5 (-6) 0 == [0] -- raicesEnteras 1 1 (-6) == [2,-3] -- raicesEnteras 2 (-1) (-6) == [2] -- raicesEnteras 2 0 0 == [0] -- raicesEnteras 6 5 (-6) == [] -- Usando raicesEnteras calcular las raíces de la ecuación -- 7x^2-11281x+2665212 = 0. -- --------------------------------------------------------------------- raicesEnteras :: Int -> Int -> Int -> [Int] raicesEnteras a b c | b == 0 && c == 0 = [0] | c == 0 && rem b a /= 0 = [0] | c == 0 && rem b a == 0 = [0,-b `div` a] | otherwise = [x | x <- divisores c, a*(x^2) + b*x + c == 0] -- (divisores n) es la lista de los divisores enteros de n. Por ejemplo, -- divisores (-6) == [1,2,3,6,-1,-2,-3,-6] divisores :: Int -> [Int] divisores n = ys ++ (map (0-) ys) where ys = [x | x <-[1..abs n], mod n x == 0] -- Una definición alternativa es raicesEnteras2 a b c = [floor x | x <- raices a b c, esEntero x] -- (esEntero x) se verifica si x es un número entero. esEntero x = ceiling x == floor x -- (raices a b c) es la lista de las raices reales de la ecuación -- ax^2+b*x+c = 0. raices a b c | d < 0 = [] | d == 0 = [y1] | otherwise = [y1,y2] where d = b^2 - 4*a*c y1 = ((-b) + sqrt d)/(2*a) y2 = ((-b) - sqrt d)/(2*a) -- --------------------------------------------------------------------- -- Ejercicio 3. Definir la función -- segmentos :: (a -> Bool) -> [a] -> [[a]] -- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos -- elementos no verifican la propiedad p. Por ejemplo, -- segmentos odd [1,2,0,4,5,6,48,7,2] == [[],[2,0,4],[6,48],[2]] -- segmentos odd [8,6,1,2,0,4,5,6,7,2] == [[8,6],[2,0,4],[6],[2]] -- --------------------------------------------------------------------- segmentos :: (a -> Bool) -> [a] -> [[a]] segmentos _ [] = [] segmentos p xs = takeWhile (not.p) xs : (segmentos p (dropWhile p (dropWhile (not.p) xs))) -- --------------------------------------------------------------------- -- Ejercicio 4.1. Un número n es especial si al concatenar n y n+1 se -- obtiene otro número que es divisible entre la suma de n y n+1. Por -- ejemplo, 1, 4, 16 y 49 son especiales ya que -- 1+2 divide a 12 - 12/3 = 4 -- 4+5 divide a 45 - 45/9 = 5 -- 16+17 divide a 1617 - 1617/33 = 49 -- 49+50 divide a 4950 - 4950/99 = 50 -- Definir la función -- esEspecial :: Integer -> Bool -- tal que (esEspecial n) se verifica si el número obtenido concatenando -- n y n+1 es divisible entre la suma de n y n+1. Por ejemplo, -- esEspecial 4 == True -- esEspecial 7 == False -- --------------------------------------------------------------------- esEspecial :: Integer -> Bool esEspecial n = pegaNumeros n (n+1) `rem` (2*n+1) == 0 -- (pegaNumeros x y) es el número resultante de "pegar" los -- números x e y. Por ejemplo, -- pegaNumeros 12 987 == 12987 -- pegaNumeros 1204 7 == 12047 -- pegaNumeros 100 100 == 100100 pegaNumeros :: Integer -> Integer -> Integer pegaNumeros x y | y < 10 = 10*x+y | otherwise = 10 * pegaNumeros x (y `div` 10) + (y `mod` 10) -- --------------------------------------------------------------------- -- Ejercicio 4.2. Definir la función -- especiales :: Int -> [Integer] -- tal que (especiales n) es la lista de los n primeros números -- especiales. Por ejemplo, -- especiales 5 == [1,4,16,49,166] -- --------------------------------------------------------------------- especiales :: Int -> [Integer] especiales n = take n [x | x <- [1..], esEspecial x] |