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]