I1M2011: Ejercicios de definiciones por comprensión en Haskell (2)
En la clase de hoy de Informática de 1º del Grado en Matemáticas hemos comentado las soluciones a los 5 primeros ejercicios de la 4ª relación que tratan sobre definiciones por comprensión.
Los ejercicios, y sus soluciones, se muestran a continuació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 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
-- I1M 2011-12: Rel_4_sol.hs -- Definiciones por comprensión (2) -- Departamento de Ciencias de la Computación e I.A. -- Universidad de Sevilla -- ===================================================================== -- --------------------------------------------------------------------- -- Introducción -- -- --------------------------------------------------------------------- -- En esta relación se presentan más ejercicios con definiciones por -- comprensión correspondientes al tema 5 cuyas transparencias se -- encuentran en -- http://www.cs.us.es/~jalonso/cursos/i1m-11/temas/tema-5.pdf -- --------------------------------------------------------------------- -- Ejercicio 1.1. Definir la función aproxE tal que (aproXE n) es la -- lista cuyos elementos son los términos de la sucesión (1+1/m)**m -- desde 1 hasta n. Por ejemplo, -- aproxE 1 == [2.0] -- aproxE 4 == [2.0,2.25,2.37037037037037,2.44140625] -- --------------------------------------------------------------------- aproxE n = [(1+1/m)**m | m <- [1..n]] -- --------------------------------------------------------------------- -- Ejercicio 1.2. ¿Cuál es el límite de la sucesión (1+1/m)**m ? -- --------------------------------------------------------------------- -- El límite de la sucesión es el número e. -- --------------------------------------------------------------------- -- Ejercicio 1.3. Definir la función errorE tal que (errorE x) es el -- menor número de términos de la sucesión (1+1/m)**m necesarios para -- obtener su límite con un error menor que x. Por ejemplo, -- errorAproxE 0.1 == 13.0 -- errorAproxE 0.01 == 135.0 -- errorAproxE 0.001 == 1359.0 -- Indicación: En Haskell, e se calcula como (exp 1). -- --------------------------------------------------------------------- errorAproxE x = head [m | m <- [1..], abs((exp 1) - (1+1/m)**m) < x] -- --------------------------------------------------------------------- -- Ejercicio 2.1. Definir la función aproxLimSeno tal que -- (aproxLimSeno n) es la lista cuyos elementos son los términos de la -- sucesión -- sen(1/m) -- -------- -- 1/m -- desde 1 hasta n. Por ejemplo, -- aproxLimSeno 1 == [0.8414709848078965] -- aproxLimSeno 2 == [0.8414709848078965,0.958851077208406] -- --------------------------------------------------------------------- aproxLimSeno n = [sin(1/m)/(1/m) | m <- [1..n]] -- --------------------------------------------------------------------- -- Ejercicio 2.2. ¿Cuál es el límite de la sucesión sen(1/m)/(1/m) ? -- --------------------------------------------------------------------- -- El límite es 1. -- --------------------------------------------------------------------- -- Ejercicio 2.3. Definir la función errorLimSeno tal que -- (errorLimSeno x) es el menor número de términos de la sucesión -- sen(1/m)/(1/m) necesarios para obtener su límite con un error menor -- que x. Por ejemplo, -- errorLimSeno 0.1 == 2.0 -- errorLimSeno 0.01 == 5.0 -- errorLimSeno 0.001 == 13.0 -- errorLimSeno 0.0001 == 41.0 -- --------------------------------------------------------------------- errorLimSeno x = head [m | m <- [1..], abs(1 - sin(1/m)/(1/m)) < x] -- --------------------------------------------------------------------- -- Ejercicio 3.1. Definir la función calculaPi tal que (calculaPi n) es -- la aproximación del número pi calculada mediante la expresión -- 4*(1 - 1/3 + 1/5 - 1/7 + ...+ (-1)**n/(2*n+1)) -- Por ejemplo, -- calculaPi 3 == 2.8952380952380956 -- calculaPi 300 == 3.1449149035588526 -- --------------------------------------------------------------------- calculaPi n = 4 * sum [(-1)**x/(2*x+1) | x <- [0..n]] -- --------------------------------------------------------------------- -- Ejercicio 3.2. Definir la función errorPi tal que -- (errorPi x) es el menor número de términos de la serie -- 4*(1 - 1/3 + 1/5 - 1/7 + ...+ (-1)**n/(2*n+1)) -- necesarios para obtener pi con un error menor que x. Por ejemplo, -- errorPi 0.1 == 9.0 -- errorPi 0.01 == 99.0 -- errorPi 0.001 == 999.0 -- --------------------------------------------------------------------- errorPi x = head [n | n <- [1..], abs (pi - (calculaPi n)) < x] -- --------------------------------------------------------------------- -- Ejercicio 4.1. Definir la función suma tal (suma n) es la suma de los -- n primeros números. Por ejemplo, -- suma 3 == 6 -- --------------------------------------------------------------------- suma n = sum [1..n] -- Otra definición es suma' n = (1+n)*n `div` 2 -- --------------------------------------------------------------------- -- Ejercicio 4.2. Los triángulo aritmético se forman como sigue -- 1 -- 2 3 -- 4 5 6 -- 7 8 9 10 -- 11 12 13 14 15 -- 16 16 18 19 20 21 -- Definir la función linea tal que (linea n) es la línea n-ésima de los -- triángulos aritméticos. Por ejemplo, -- linea 4 == [7,8,9,10] -- linea 5 == [11,12,13,14,15] -- --------------------------------------------------------------------- linea n = [suma (n-1)+1..suma n] -- --------------------------------------------------------------------- -- Ejercicio 4.3. Definir la función triangulo tal que (triangulo n) es -- el triángulo aritmético de altura n. Por ejemplo, -- triangulo 3 == [[1],[2,3],[4,5,6]] -- triangulo 4 == [[1],[2,3],[4,5,6],[7,8,9,10]] -- --------------------------------------------------------------------- triangulo n = [linea m | m <- [1..n]] -- --------------------------------------------------------------------- -- Ejercicio 5. La bases de datos sobre actividades de personas pueden -- representarse mediante listas de elementos de la forma (a,b,c,d), -- donde a es el nombre de la persona, b su actividad, c su fecha de -- nacimiento y d la de su fallecimiento. Un ejemplo es la siguiente que -- usaremos a lo largo de este ejercicio, -- --------------------------------------------------------------------- personas :: [(String,String,Int,Int)] personas = [("Cervantes","Literatura",1547,1616), ("Velazquez","Pintura",1599,1660), ("Picasso","Pintura",1881,1973), ("Beethoven","Musica",1770,1823), ("Poincare","Ciencia",1854,1912), ("Quevedo","Literatura",1580,1654), ("Goya","Pintura",1746,1828), ("Einstein","Ciencia",1879,1955), ("Mozart","Musica",1756,1791), ("Botticelli","Pintura",1445,1510), ("Borromini","Arquitectura",1599,1667), ("Bach","Musica",1685,1750)] -- --------------------------------------------------------------------- -- Ejercicio 5.1. Definir la función nombres tal que (nombres bd) es -- la lista de los nombres de las personas de la base de datos bd. Por -- ejemplo, -- ghci> nombres personas -- ["Cervantes","Velazquez","Picasso","Beethoven","Poincare", -- "Quevedo","Goya","Einstein","Mozart","Botticelli","Borromini","Bach"] -- --------------------------------------------------------------------- nombres :: [(String,String,Int,Int)] -> [String] nombres bd = [x | (x,_,_,_) <- bd] -- --------------------------------------------------------------------- -- Ejercicio 5.2. Definir la función musicos tal que (musicos bd) es -- la lista de los nombres de los músicos de la base de datos bd. Por -- ejemplo, -- ghci> musicos personas -- ["Beethoven","Mozart","Bach"] -- --------------------------------------------------------------------- musicos :: [(String,String,Int,Int)] -> [String] musicos bd = [x | (x,m,_,_) <- bd, m == "Musica"] -- --------------------------------------------------------------------- -- Ejercicio 5.3. Definir la función seleccion tal que (seleccion bd m) -- es la lista de los nombres de las personas de la base de datos bd -- cuya actividad es m. Por ejemplo, -- ghci> seleccion personas "Pintura" -- ["Velazquez","Picasso","Goya","Botticelli"] -- --------------------------------------------------------------------- seleccion :: [(String,String,Int,Int)] -> String -> [String] seleccion bd m = [ x | (x,m',_,_) <- bd, m == m' ] -- --------------------------------------------------------------------- -- Ejercicio 5.4. Definir, usando el apartado anterior, la función -- musicos' tal que (musicos' bd) es la lista de los nombres de los -- músicos de la base de datos bd. Por ejemplo, -- ghci> musicos' personas -- ["Beethoven","Mozart","Bach"] -- --------------------------------------------------------------------- musicos' :: [(String,String,Int,Int)] -> [String] musicos' bd = seleccion bd "Musica" -- --------------------------------------------------------------------- -- Ejercicio 5.5. Definir la función vivas tal que (vivas bd a) es la -- lista de los nombres de las personas de la base de datos bd que -- estaban vivas en el año a. Por ejemplo, -- ghci> vivas personas 1600 -- ["Cervantes","Velazquez","Quevedo","Borromini"] -- --------------------------------------------------------------------- vivas :: [(String,String,Int,Int)] -> Int -> [String] vivas ps a = [x | (x,_,a1,a2) <- ps, a1 <= a, a <= a2] |