Sumas y restas alternativas
Definir la función
sumasYrestas :: Num a => [a] -> a
tal que (sumasYrestas xs) es el resultado de alternativamente los elementos de xs. Por ejemplo,
sumasYrestas [3,2,4,1,7] = 3 - 2 + 4 - 1 + 7 = 11
Otros ejemplos,
sumasYrestas [3,2,4] == 5 sumasYrestas [3,2,4,1] == 4 sumasYrestas [3,2,4,1,7] == 11 sumasYrestas (replicate (10^6) 1) == 0
Soluciones
-- 1ª definición sumasYrestas :: Num a => [a] -> a sumasYrestas xs = aux 1 xs where aux _ [] = 0 aux n (y:ys) = n * y + aux (-n) ys -- 2ª definición sumasYrestas2 :: Num a => [a] -> a sumasYrestas2 xs = sum (zipWith (*) xs [(-1)^n | n <- [0..]]) -- Comparación de eficiencia -- λ> sumasYrestas (replicate (10^6) 1) -- 0 -- (4.16 secs, 385,661,232 bytes) -- λ> sumasYrestas2 (replicate (10^6) 1) -- 0 -- (16.09 secs, 5,723,392,640 bytes)