Elementos adicionales
Enunciado
1 2 3 4 5 6 7 8 9 10 |
-- Definir la función -- adicionales :: Ord a => Int -> [a] -> [a] -> [a] -- tal que (adicionales n xs ys) es la lista de los n elementos de xs -- que no pertenecen a ys (se supone que las listas xs e ys están -- ordenadas y que pueden ser infinitas). Por ejemplo, -- adicionales 0 [1,3] [1,3] == [] -- adicionales 1 [1,3] [1] == [3] -- adicionales 2 [1,3,5] [1] == [3,5] -- adicionales 2 [1,3,5,7,9] [1,5,7] == [3,9] -- adicionales 2 ([1,3,5]++[7..]) ([1]++[7..]) == [3,5] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- 1ª definición (por recursión) adicionales1 :: Ord a => Int -> [a] -> [a] -> [a] adicionales1 0 _ _ = [] adicionales1 _ xs [] = xs adicionales1 n (x:xs) (y:ys) | x < y = x : adicionales1 (n-1) xs (y:ys) | x == y = adicionales1 n xs ys | otherwise = adicionales1 n (x:xs) ys -- 2ª definición (por comprensión): adicionales2 :: Ord a => Int -> [a] -> [a] -> [a] adicionales2 n xs ys = take n [x | x <- xs, x `noPertenece` ys] -- (noPertenece x ys) se verifica si x no pertenece a la lista ordenada -- (posiblemente infinita ys). Por ejemplo. -- noPertenece 2 [3,5] == True -- noPertenece 4 [3,5] == True -- noPertenece 7 [3,5] == True -- noPertenece 4 [3,5..] == True noPertenece :: Ord a => a -> [a] -> Bool noPertenece x ys = null zs || head zs /= x where zs = dropWhile (<x) ys |
Un comentario