I1M2012: Ejercicios de definiciones por comprensión (4)
En la clase de hoy del curso Informática (de 1º de Grado en Matemáticas) se han comentado las soluciones de los ejercicios 1 y 2 de la 5ª relación sobre definiciones por comprensión.
Los ejercicios y sus soluciones se muestran a continuación
Haskell
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 |
-- --------------------------------------------------------------------- -- 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.1. Una terna (x,y,z) de enteros positivos es pitagórica -- si x^2 + y^2 = z^2. Usando una lista por comprensión, definir la -- función -- pitagoricas :: Int -> [(Int,Int,Int)] -- tal que (pitagoricas n) es la lista de todas las ternas pitagóricas -- cuyas componentes están entre 1 y n. Por ejemplo, -- pitagoricas 10 == [(3,4,5),(4,3,5),(6,8,10),(8,6,10)] -- --------------------------------------------------------------------- pitagoricas :: Int -> [(Int,Int,Int)] pitagoricas n = [(x,y,z) | x <- [1..n], y <- [1..n], z <- [1..n], x^2 + y^2 == z^2] -- --------------------------------------------------------------------- -- Ejercicio 1.2. Definir la función -- numeroDePares :: (Int,Int,Int) -> Int -- tal que (numeroDePares t) es el número de elementos pares de la terna -- t. Por ejemplo, -- numeroDePares (3,5,7) == 0 -- numeroDePares (3,6,7) == 1 -- numeroDePares (3,6,4) == 2 -- numeroDePares (4,6,4) == 3 -- --------------------------------------------------------------------- numeroDePares :: (Int,Int,Int) -> Int numeroDePares (x,y,z) = length [1 | n <- [x,y,z], even n] -- --------------------------------------------------------------------- -- Ejercicio 1.3. Definir la función -- conjetura :: Int -> Bool -- tal que (conjetura n) se verifica si todas las ternas pitagóricas -- cuyas componentes están entre 1 y n tiene un número impar de números -- pares. Por ejemplo, -- conjetura 10 == True -- --------------------------------------------------------------------- conjetura :: Int -> Bool conjetura n = and [odd (numeroDePares t) | t <- pitagoricas n] -- --------------------------------------------------------------------- -- Ejercicio 1.4. Demostrar la conjetura para todas las ternas -- pitagóricas. -- --------------------------------------------------------------------- -- Sea (x,y,z) una terna pitagórica. Entonces x^2+y^2=z^2. Pueden darse -- 4 casos: -- -- Caso 1: x e y son pares. Entonces, x^2, y^2 y z^2 también lo -- son. Luego el número de componentes pares es 3 que es impar. -- -- Caso 2: x es par e y es impar. Entonces, x^2 es par, y^2 es impar y -- z^2 es impar. Luego el número de componentes pares es 1 que es impar. -- -- Caso 3: x es impar e y es par. Análogo al caso 2. -- -- Caso 4: x e y son impares. Entonces, x^2 e y^2 también son impares y -- z^2 es par. Luego el número de componentes pares es 1 que es impar. -- --------------------------------------------------------------------- -- Ejercicio 2.1. (Problema 9 del Proyecto Euler). Una terna pitagórica -- es una terna de números naturales (a,b,c) tal que a<b<c y -- a^2+b^2=c^2. Por ejemplo (3,4,5) es una terna pitagórica. -- -- Definir la función -- ternasPitagoricas :: Integer -> [[Integer]] -- tal que (ternasPitagoricas x) es la lista de las ternas pitagóricas -- cuya suma es x. Por ejemplo, -- ternasPitagoricas 12 == [(3,4,5)] -- ternasPitagoricas 60 == [(10,24,26),(15,20,25)] -- --------------------------------------------------------------------- ternasPitagoricas :: Integer -> [(Integer,Integer,Integer)] ternasPitagoricas x = [(a,b,c) | a <- [1..x], b <- [a+1..x], c <- [x-a-b], a^2 + b^2 == c^2] -- --------------------------------------------------------------------- -- Ejercicio 2.2. Definir la constante euler9 tal que euler9 es producto -- abc donde (a,b,c) es la única terna pitagórica tal que a+b+c=1000. -- Calcular el valor de euler9. -- --------------------------------------------------------------------- euler9 = a*b*c where (a,b,c) = head (ternasPitagoricas 1000) -- El cálculo del valor de euler9 es -- ghci> euler9 -- 31875000 |