Suma ordenada de listas infinitas ordenadas
Definir la función
1 |
sumaOrdenada :: [Integer] -> [Integer] -> [Integer] |
tal que (sumaOrdenada xs ys) es la suma ordenada de las listas infinitas crecientes xs e ys. Por ejemplo,
1 2 3 4 |
λ> take 15 (sumaOrdenada [5,10..] [7,14..]) [12,17,19,22,24,26,27,29,31,32,33,34,36,37,38] λ> take 15 (sumaOrdenada [2^n | n <- [0..]] [3^n | n <- [0..]]) [2,3,4,5,7,9,10,11,13,17,19,25,28,29,31] |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- 1ª definición -- ============= sumaOrdenada1 :: [Integer] -> [Integer] -> [Integer] sumaOrdenada1 (x:xs) (y:ys) = x+y : map (+x) ys `mezcla` map (+y) xs `mezcla` sumaOrdenada1 ys xs mezcla :: Ord a => [a] -> [a] -> [a] mezcla (x:xs) (y:ys) | x < y = x : mezcla xs (y:ys) | x == y = x : mezcla xs ys | x > y = y : mezcla (x:xs) ys -- 2ª definición -- ============= sumaOrdenada2 :: [Integer] -> [Integer] -> [Integer] sumaOrdenada2 xs ys = mezclaTodas [map (+x) ys | x <- xs] mezclaTodas :: Ord a => [[a]] -> [a] mezclaTodas = foldr1 xmezcla where xmezcla (x:xs) ys = x : mezcla xs ys |
Al comprobar uno a uno los números naturales, esta solución tiene problemas con las series compuestas de números grandes con grandes espacios. Por ejemplo: