I1M2018: Ejercicios de definiciones con condicionales, guardas o patrones (2)
En la segunda parte de la clase de hoy del curso de Informática de 1º del Grado en Matemáticas se han comentado las soluciones de ejercicios de la 2ª relación sobre definiciones con condicionales, guardas o patrones.
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 |
-- --------------------------------------------------------------------- -- Ejercicio 8. Definir la función -- numeroDeRaices :: (Floating t, Ord t) => t -> t -> t -> Int -- tal que (numeroDeRaices a b c) es el número de raíces reales de la -- ecuación a*x^2 + b*x + c = 0. Por ejemplo, -- numeroDeRaices 2 0 3 == 0 -- numeroDeRaices 4 4 1 == 1 -- numeroDeRaices 5 23 12 == 2 -- Nota: Se supone que a es no nulo. -- --------------------------------------------------------------------- numeroDeRaices :: Double -> Double -> Double -> Int numeroDeRaices a b c | d < 0 = 0 | d == 0 = 1 | otherwise = 2 where d = b**2-4*a*c -- 2ª solución numeroDeRaices2 :: Double -> Double -> Double -> Int numeroDeRaices2 a b c = 1 + round (signum (b**2-4*a*c)) -- --------------------------------------------------------------------- -- Ejercicio 9. Definir la función -- raices :: Double -> Double -> Double -> [Double] -- tal que (raices a b c) es la lista de las raíces reales de la -- ecuación ax^2 + bx + c = 0. Por ejemplo, -- raices 1 3 2 == [-1.0,-2.0] -- raices 1 (-2) 1 == [1.0,1.0] -- raices 1 0 1 == [] -- Nota: Se supone que a es no nulo. -- --------------------------------------------------------------------- raices :: Double -> Double -> Double -> [Double] raices a b c | d >= 0 = [(-b+e)/t,(-b-e)/t] | otherwise = [] where d = b**2 - 4*a*c e = sqrt d t = 2*a -- --------------------------------------------------------------------- -- Ejercicio 10. En geometría, la fórmula de Herón, descubierta por -- Herón de Alejandría, dice que el área de un triángulo cuyo lados -- miden a, b y c es la raíz cuadrada de s(s-a)(s-b)(s-c) donde s es el -- semiperímetro -- s = (a+b+c)/2 -- -- Definir la función -- area :: Double -> Double -> Double -> Double -- tal que (area a b c) es el área del triángulo de lados a, b y c. Por -- ejemplo, -- area 3 4 5 == 6.0 -- --------------------------------------------------------------------- area :: Double -> Double -> Double -> Double area a b c = sqrt (s*(s-a)*(s-b)*(s-c)) where s = (a+b+c)/2 -- --------------------------------------------------------------------- -- Ejercicio 11.1. Los intervalos cerrados se pueden representar mediante -- una lista de dos números (el primero es el extremo inferior del -- intervalo y el segundo el superior). -- -- Definir la función -- interseccion :: Ord a => [a] -> [a] -> [a] -- tal que (interseccion i1 i2) es la intersección de los intervalos i1 e -- i2. Por ejemplo, -- interseccion [] [3,5] == [] -- interseccion [3,5] [] == [] -- interseccion [2,4] [6,9] == [] -- interseccion [2,6] [6,9] == [6,6] -- interseccion [2,6] [0,9] == [2,6] -- interseccion [2,6] [0,4] == [2,4] -- interseccion [4,6] [0,4] == [4,4] -- interseccion [5,6] [0,4] == [] -- --------------------------------------------------------------------- interseccion :: Ord a => [a] -> [a] -> [a] interseccion [] _ = [] interseccion _ [] = [] interseccion [a1,b1] [a2,b2] | a <= b = [a,b] | otherwise = [] where a = max a1 a2 b = min b1 b2 interseccion _ _ = error "Imposible" -- --------------------------------------------------------------------- -- Ejercicio 12.1. Los números racionales pueden representarse mediante -- pares de números enteros. Por ejemplo, el número 2/5 puede -- representarse mediante el par (2,5). -- -- Definir la función -- formaReducida :: (Int,Int) -> (Int,Int) -- tal que (formaReducida x) es la forma reducida del número racional -- x. Por ejemplo, -- formaReducida (4,10) == (2,5) -- formaReducida (0,5) == (0,1) -- --------------------------------------------------------------------- formaReducida :: (Int,Int) -> (Int,Int) formaReducida (0,_) = (0,1) formaReducida (a,b) = (x * signum (a*b), y) where c = gcd a b x = abs (a `div` c) y = abs (b `div` c) -- --------------------------------------------------------------------- -- Ejercicio 12.2. Definir la función -- sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) -- tal que (sumaRacional x y) es la suma de los números racionales x e -- y, expresada en forma reducida. Por ejemplo, -- sumaRacional (2,3) (5,6) == (3,2) -- sumaRacional (3,5) (-3,5) == (0,1) -- --------------------------------------------------------------------- sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) sumaRacional (a,b) (c,d) = formaReducida (a*d+b*c, b*d) -- --------------------------------------------------------------------- -- Ejercicio 12.3. Definir la función -- productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) -- tal que (productoRacional x y) es el producto de los números -- racionales x e y, expresada en forma reducida. Por ejemplo, -- productoRacional (2,3) (5,6) == (5,9) -- --------------------------------------------------------------------- productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) productoRacional (a,b) (c,d) = formaReducida (a*c, b*d) -- --------------------------------------------------------------------- -- Ejercicio 12.4. Definir la función -- igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool -- tal que (igualdadRacional x y) se verifica si los números racionales -- x e y son iguales. Por ejemplo, -- igualdadRacional (6,9) (10,15) == True -- igualdadRacional (6,9) (11,15) == False -- igualdadRacional (0,2) (0,-5) == True -- --------------------------------------------------------------------- igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool igualdadRacional (a,b) (c,d) = a*d == b*c |