I1M2016: Ejercicios de funciones de orden superior
En la primera parte de la clase de hoy de Informática de 1º del Grado en Matemáticas hemos comentado las soluciones de los primeros ejercicios de la relación 8 sobre Funciones de orden superior.
Los ejercicios y su solución 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 -- -- --------------------------------------------------------------------- -- Esta relación tiene contiene ejercicios con funciones de orden -- superior y definiciones por plegado correspondientes al tema 7 -- http://www.cs.us.es/~jalonso/cursos/i1m-16/temas/tema-7.html -- --------------------------------------------------------------------- -- Importación de librerías auxiliares -- -- --------------------------------------------------------------------- import Test.QuickCheck -- --------------------------------------------------------------------- -- Ejercicio 1. Definir la función -- segmentos :: (a -> Bool) -> [a] -> [a] -- tal que (segmentos p xs) es la lista de los segmentos de xs cuyos -- elementos verifican la propiedad p. Por ejemplo, -- segmentos even [1,2,0,4,9,6,4,5,7,2] == [[2,0,4],[6,4],[2]] -- segmentos odd [1,2,0,4,9,6,4,5,7,2] == [[1],[9],[5,7]] -- --------------------------------------------------------------------- segmentos :: (a -> Bool) -> [a] -> [[a]] segmentos _ [] = [] segmentos p (x:xs) | p x = takeWhile p (x:xs) : segmentos p (dropWhile p xs) | otherwise = segmentos p xs -- --------------------------------------------------------------------- -- Ejercicio 2.1. Definir, por comprensión, la función -- relacionadosC :: (a -> a -> Bool) -> [a] -> Bool -- tal que (relacionadosC r xs) se verifica si para todo par (x,y) de -- elementos consecutivos de xs se cumple la relación r. Por ejemplo, -- relacionadosC (<) [2,3,7,9] == True -- relacionadosC (<) [2,3,1,9] == False -- --------------------------------------------------------------------- relacionadosC :: (a -> a -> Bool) -> [a] -> Bool relacionadosC r xs = and [r x y | (x,y) <- zip xs (tail xs)] -- --------------------------------------------------------------------- -- Ejercicio 2.2. Definir, por recursión, la función -- relacionadosR :: (a -> a -> Bool) -> [a] -> Bool -- tal que (relacionadosR r xs) se verifica si para todo par (x,y) de -- elementos consecutivos de xs se cumple la relación r. Por ejemplo, -- relacionadosR (<) [2,3,7,9] == True -- relacionadosR (<) [2,3,1,9] == False -- --------------------------------------------------------------------- relacionadosR :: (a -> a -> Bool) -> [a] -> Bool relacionadosR r (x:y:zs) = (r x y) && relacionadosR r (y:zs) relacionadosR _ _ = True -- --------------------------------------------------------------------- -- Ejercicio 3.1. Definir la función -- agrupa :: Eq a => [[a]] -> [[a]] -- tal que (agrupa xss) es la lista de las listas obtenidas agrupando -- los primeros elementos, los segundos, ... Por ejemplo, -- agrupa [[1..6],[7..9],[10..20]] == [[1,7,10],[2,8,11],[3,9,12]] -- agrupa [] == [] -- --------------------------------------------------------------------- agrupa :: Eq a => [[a]] -> [[a]] agrupa [] = [] agrupa xss | [] `elem` xss = [] | otherwise = primeros xss : agrupa (restos xss) where primeros = map head restos = map tail -- --------------------------------------------------------------------- -- Ejercicio 3.2. Comprobar con QuickChek que la longitud de todos los -- elementos de (agrupa xs) es igual a la longitud de xs. -- --------------------------------------------------------------------- -- La propiedad es prop_agrupa :: [[Int]] -> Bool prop_agrupa xss = and [length xs == n | xs <- agrupa xss] where n = length xss -- La comprobación es -- ghci> quickCheck prop_agrupa -- +++ OK, passed 100 tests. |