I1M2012: Ejercicios de definiciones por comprensión (1)
En la clase de hoy del curso Informática (de 1º de Grado en Matemáticas) se han comentado las soluciones de los 3 primeros ejercicios de la 4ª relación 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 |
-- --------------------------------------------------------------------- -- Introducción -- -- --------------------------------------------------------------------- -- En esta relación se presentan ejercicios con definiciones por -- comprensión correspondientes al tema 5 cuyas transparencias se -- encuentran en -- http://www.cs.us.es/~jalonso/cursos/i1m-12/temas/tema-5.pdf -- --------------------------------------------------------------------- -- Ejercicio 1. Definir, por comprensión, la función -- sumaDeCuadrados :: Integer -> Integer -- tal que (sumaDeCuadrados n) es la suma de los cuadrados de los -- primeros n números; es decir, 1^2 + 2^2 + ... + n^2. Por ejemplo, -- sumaDeCuadrados 3 == 14 -- sumaDeCuadrados 100 == 338350 -- --------------------------------------------------------------------- sumaDeCuadrados :: Integer -> Integer sumaDeCuadrados n = sum [x^2 | x <- [1..n]] -- --------------------------------------------------------------------- -- Ejercicio 2. Definir por comprensión la función -- replica :: Int -> a -> [a] -- tal que (replica n x) es la lista formada por n copias del elemento -- x. Por ejemplo, -- replica 3 True == [True, True, True] -- Nota: La función replica es equivalente a la predefinida replicate. -- --------------------------------------------------------------------- replica :: Int -> a -> [a] replica n x = [x | _ <- [1..n]] -- --------------------------------------------------------------------- -- Ejercicio 3.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 más eficiente es suma2 n = (1+n)*n `div` 2 -- --------------------------------------------------------------------- -- Ejercicio 3.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] -- La definición puede mejorarse linea2 n = [s+1..s+n] where s = suma (n-1) -- Una variante más eficiente es linea3 n = [s+1..s+n] where s = suma2 (n-1) -- La mejora de la eficiencia se puede observar como sigue: -- ghci> :set +s -- ghci> head (linea 1000000) -- 499999500001 -- (17.94 secs, 309207420 bytes) -- ghci> head (linea3 1000000) -- 499999500001 -- (0.01 secs, 525496 bytes) -- --------------------------------------------------------------------- -- Ejercicio 3.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]] |