Enunciado
-- 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] |
-- 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ª 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 |
-- 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
Se puede imprimir o compartir con
Una solución de “Elementos adicionales”