Ir al contenido principal

Descomposiciones como sumas de n sumandos

Definir la función

sumas :: (Num a, Ord a) => Int -> [a] -> a -> [[a]]

tal que (sumas n ys x) es la lista de las descomposiciones de x como sumas de n sumandos en la lista ns. Por ejemplo,

sumas 2 [1,2] 3    ==  [[1,2],[2,1]]
sumas 2 [1,2] 4    ==  [[2,2]]
sumas 2 [1,2] 5    ==  []
sumas 3 [1,2] 5    ==  [[1,2,2],[2,1,2],[2,2,1]]
sumas 3 [1,2] 6    ==  [[2,2,2]]
sumas 2 [1,2,5] 6  ==  [[1,5],[5,1]]

Soluciones

sumas :: (Num a, Ord a) => Int -> [a] -> a -> [[a]]
sumas 1 ys x | x `elem` ys = [[x]]
             | otherwise   = []
sumas n ys x =
    concat [[y:zs | zs <- sumas (n-1) ys (x-y)] | y <- ys, y <= x]