I1M2011: Ejercicios de definiciones por recursión en Haskell (2)
En la clase de hoy de Informática de 1º del Grado en Matemáticas hemos continuado los comentarios sobre las soluciones de los ejercicios de la 6ª relación, que tratan sobre definiciones por recursión, que comenzamos en la clase anterior.
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 |
-- --------------------------------------------------------------------- -- Ejercicio 13. Definir por recursión la función -- take' :: Int -> [a] -> [a] -- tal que (take' n xs) es la lista de los n primeros elementos de -- xs. Por ejemplo, -- take' 3 [4..12] => [4,5,6] -- --------------------------------------------------------------------- take' :: Int -> [a] -> [a] take' 0 _ = [] take' (n+1) [] = [] take' (n+1) (x:xs) = x : take' n xs -- --------------------------------------------------------------------- -- Ejercicio 14. Definir por recursión la función -- last' :: [a] -> a -- tal que (last xs) es el último elemento de xs. Por ejemplo, -- last' [2,3,5] => 5 -- --------------------------------------------------------------------- last' :: [a] -> a last' [x] = x last' (_:xs) = last' xs -- --------------------------------------------------------------------- -- Ejercicio 15. Dados dos números naturales, a y b, es posible -- calcular su máximo común divisor mediante el Algoritmo de -- Euclides. Este algoritmo se puede resumir en la siguiente fórmula: -- mcd(a,b) = a, si b = 0 -- = mcd (b, a módulo b), si b > 0 -- -- Definir la función -- mcd :: Integer -> Integer -> Integer -- tal que (mcd a b) es el máximo común divisor de a y b calculado -- mediante el algoritmo de Euclides. Por ejemplo, -- mcd 30 45 == 15 -- --------------------------------------------------------------------- mcd :: Integer -> Integer -> Integer mcd a 0 = a mcd a b = mcd b (a `mod` b) -- --------------------------------------------------------------------- -- Ejercicio 16. (Problema 5 del proyecto Euler) El problema se encuentra -- en http://goo.gl/L5bb y consiste en calcular el menor número -- divisible por los números del 1 al 20. Lo resolveremos mediante los -- distintos apartados de este ejercicio. -- --------------------------------------------------------------------- -- --------------------------------------------------------------------- -- Ejercicio 16.1. Definir por recursión la función -- menorDivisible :: Integer -> Integer -> Integer -- tal que (menorDivisible a b) es el menor número divisible por los -- números del a al b. Por ejemplo, -- menorDivisible 2 5 == 60 -- Indicación: Usar la función lcm tal que (lcm x y) es el mínimo común -- múltiplo de x e y. -- --------------------------------------------------------------------- menorDivisible :: Integer -> Integer -> Integer menorDivisible a b | a == b = a | otherwise = lcm a (menorDivisible (a+1) b) -- --------------------------------------------------------------------- -- Ejercicio 16.2. Definir la constante -- euler5 :: Integer -- tal que euler5 es el menor número divisible por los números del 1 al -- 20 y calcular su valor. -- --------------------------------------------------------------------- euler5 :: Integer euler5 = menorDivisible 1 20 -- El cálculo es -- ghci> euler5 -- 232792560 |