Sumas de posiciones pares e impares
Definir la función
1 |
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,
1 2 3 4 5 6 |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- 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) |
Por plegados:
Por recursión con contador: