Ir al contenido principal

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)