Menu Close

Suma de una lista de vectores

Definir la función

   sumaVec :: Num a => [[a]] -> [a]

tal que (sumaVec xss) es la suma de los vectores de xss. Por ejemplo,

   sumaVec [[4,7,3],[3,1,4],[2,2,5]]  ==  [9,10,12]
   sumaVec [[4,7],[3,3],[1,4],[2,5]]  ==  [10,19]

Soluciones

import Data.List (transpose)
import Data.Array (listArray,(!))
 
-- 1ª definición (por recursión):
sumaVec1 :: Num a => [[a]] -> [a]
sumaVec1 []          = []
sumaVec1 [xs]        = xs
sumaVec1 (xs:ys:zss) = suma xs (sumaVec1 (ys:zss))
 
-- (suma xs ys) es la suma de los vectores xs e ys. Por ejemplo,
--    suma [4,7,3] [1,2,5]  == [5,9,8]
suma :: Num a => [a] -> [a] -> [a]
suma [] []         = []
suma (x:xs) (y:ys) = x+y : suma xs ys
 
-- 2ª definición (por recursión con zipWith): 
sumaVec2 :: Num a => [[a]] -> [a]
sumaVec2 []       = []
sumaVec2 [xs]     = xs
sumaVec2 (xs:xss) = zipWith (+) xs (sumaVec2 xss)
 
-- 3ª definición (por plegado)
sumaVec3 :: Num a => [[a]] -> [a]
sumaVec3 = foldr1 (zipWith (+))
 
-- 4ª definición (con map y transpose):
sumaVec4 :: Num a => [[a]] -> [a]
sumaVec4 = map sum . transpose 
 
-- 5ª definición (con array)
-- =========================
 
sumaVec5 :: Num a => [[a]] -> [a]
sumaVec5 xss = [sum [p!(i,j) | i <- [1..m]] | j <- [1..n]] 
    where m = length xss
          n = length (head xss)
          p = listArray ((1,1),(m,n)) (concat xss)
Inicial

5 soluciones de “Suma de una lista de vectores

  1. Rafael González
    sumaVec :: Num a => [[a]] -> [a]
    sumaVec xss = map sum (sumaVec1 xss)
     
    sumaVec1 :: Num a => [[a]] -> [[a]]
    sumaVec1 xss | null (head xss) = []
                 | otherwise = (map head xss):(sumaVec1 (map tail xss))
  2. M Miranda
    import Data.List
     
    sumaVec :: Num a => [[a]] -> [a]
    sumaVec xss = [sum xs | xs <- transpose xss]
    • jneira

      Elegante, tambien se podria escribir en point free como

      sumaVec = map sum . transpose
  3. José María Verde López
    sumaVec :: Num a => [[a]] -> [a]
    sumaVec xss = foldr (zipWith (+)) (replicate (length (head xss)) 0) xss
  4. Eduardo Román
    sumaVec :: Num a => [[a]] -> [a]
    sumaVec xss 
        | map length xss == replicate (length xss) 1 = [sum (map head xss)]
    sumaVec xss = sum (map head xss) : sumaVec (map tail xss)

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.