Elementos no repetidos
Enunciado
1 2 3 4 5 6 7 |
-- Definir la función -- noRepetidos :: Eq a => [a] -> [a] -- tal que (noRepetidos xs) es la lista de los elementos no repetidos de -- la lista xs. Por ejemplo, -- noRepetidos [3,2,5,2,4,7,3] == [5,4,7] -- noRepetidos "noRepetidos" == "nRptids" -- noRepetidos "Roma" == "Roma" |
Soluciones
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 |
import Test.QuickCheck -- 1ª solución (por comprensión): noRepetidos :: Eq a => [a] -> [a] noRepetidos xs = [x | x <- xs, ocurrencias x xs == 1] -- (ocurrencias x ys) es el número de ocurrencias de x en ys. Por -- ejemplo, -- ocurrencias 3 [3,2,5,2,4,7,3] == 2 -- ocurrencias 5 [3,2,5,2,4,7,3] == 1 ocurrencias :: Eq a => a -> [a] -> Int ocurrencias x ys = length [y | y <- ys, y == x] -- 2ª definición (por recursión): noRepetidos2 :: Eq a => [a] -> [a] noRepetidos2 [] = [] noRepetidos2 (x:xs) | elem x xs = noRepetidos2 [y | y <- xs, y /= x] | otherwise = x : noRepetidos2 xs -- La propiedad de equivalencia es prop_equivalencia :: [Int] -> Bool prop_equivalencia xs = noRepetidos xs == noRepetidos2 xs -- La comprobación es -- ghci> quickCheck prop_equivalencia -- +++ OK, passed 100 tests. |
2 Comentarios