我对Haskell中的列表有疑问。
有一个整数列表,由不同的值组成。 如何编写函数将计算所有子列表,其中包含 n 元素和 t 总计。更清楚的是,
fList [1..5] 5 12
Output: [[1,1,1,4,5], [1,1,2,3,5], [1,1,2,4,4], ... , [2,2,2,3,3]]
(每个列表由5个元素组成,列表总和为12个。)
or
fList [2,3,4,6] 7 22
[[2,2,2,2,2,6,6], [2,2,2,2,4,4,6], ..., [3,3,3,3,3,3,4]]
(每个列表由7个元素组成,列表的总和是总共22个。)等等......
fList :: [Integer] -> Int -> Integer -> [[Integer]]
(源列表的元素可能会在目标列表中重复。)
我不知道怎么做?有人可以帮忙吗?
答案 0 :(得分:3)
想想
filter ((12==).sum) $ mapM (const [1..5]) [1..5]
(或
filter ((22==).sum) $ mapM (const [2..6]) [1..7]
编辑:
我希望你已经尝试解决你的问题,无论如何,这是一个可能的微不足道的(使用基本的Haskell)解决方案(请尝试理解)
fList :: [Integer] -> Int -> Integer -> [[Integer]]
fList _ 0 0 = [[]] -- Empty list with 0 elements sum 0
fList _ 0 _ = [] -- No list exists with 0 elements with sum != 0
fList [] _ _ = [] -- With no elements, must be n == 0
fList (x:xs) n toSum =
concat [ map ((take z $ repeat x)++) -- add x z times
(fList xs (n - z) (toSum - fromIntegral z * x)) -- reducing the problem size
| z <- reverse [0..min n (fromInteger (toSum `div` x))] -- using x, z=0,1,... times
]
答案 1 :(得分:3)
这看起来像是家庭作业。
fList
生成一个解决方案列表。这意味着您可以生成一些解决方案,并附加由fList
生成的具有不同参数的解决方案列表。
假设fList
耗尽1
。现在您有一个较短的列表要生成,并且要计算的总和较小。您可以使用fList
为该问题生成解决方案,并将1
附加到头部。
(然后还假设fList
没有使用任何1
- 您接下来需要做什么?)