一个困难的Haskell列表

时间:2014-06-03 09:11:06

标签: haskell

我对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]]

(源列表的元素可能会在目标列表中重复。)

我不知道怎么做?有人可以帮忙吗?

2 个答案:

答案 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 - 您接下来需要做什么?)