Ir al contenido principal

Sumas de posiciones pares e impares

Definir la función

sumasParesImpares :: [Integer] -> (Integer,Integer)

tal que (sumasParesImpares) xs es el par formado por la suma de los elementos de xs en posiciones pares y por la suma de los elementos de xs en posiciones impares. Por ejemplo,

sumasParesImpares []         ==  (0,0)
sumasParesImpares [3]        ==  (3,0)
sumasParesImpares [3,2]      ==  (3,2)
sumasParesImpares [3,2,1]    ==  (4,2)
sumasParesImpares [3,2,1,5]  ==  (4,7)
sumasParesImpares [1..10^7]  ==  (25000000000000,25000005000000)

Soluciones

-- 1ª solución
sumasParesImpares1 :: [Integer] -> (Integer,Integer)
sumasParesImpares1 xs =
  (sum [x | (x,n) <- xns, even n],
   sum [x | (x,n) <- xns, odd n])
  where xns = zip xs [0..]

-- 2ª solución
sumasParesImpares2 :: [Integer] -> (Integer,Integer)
sumasParesImpares2 xs = aux xs (0,0)
  where aux (x1:x2:xs) (a,b) = aux xs (x1+a,x2+b)
        aux [x]        (a,b) = (x+a,b)
        aux []         (a,b) = (a,b)

-- Comparación de eficiencia
--    λ> sumasParesImpares1 [1..10^6]
--    (250000000000,250000500000)
--    (4.48 secs, 731,994,904 bytes)
--    λ> sumasParesImpares2 [1..10^6]
--    (250000000000,250000500000)
--    (1.78 secs, 235,663,400 bytes)