Haskell拆分列表由总和值确定

苏尼尔·高塔姆(Sunil gautam)

大家好,我只是Haskell的入门者。我有这个清单[1.0, 2.0, 1.5, 1.5, n-1]我将如何将该列表拆分为子列表[3.0, 3.0,etc]也就是说,当列表的值相加时,当总和等于给定的数字(在这种情况下为3)时,将分隔列表。我希望这个问题有道理。有人可以指出我是否有Data.List可以执行此操作的功能甚至filter功能。到目前为止,我唯一拥有的是:

import Data.List 

import Text.Printf


--separate :: [Double] -> [(Double)]

separate = sum [1.0, 2.0, 0.5, 2.5, 3.0, 1.1, 2.0] -- [(1.0, 2.0),(0.5, 2.5),(3.0),(1.1,2.0)] (desired list)



main = do
 putStrLn (printf "list :  %s" $ show separate)   

更准确地说,要求是:

separate :: Double -> [Double] -> [[Double]]

在哪里separate t xs = ys暗示

  1. concat ys = xs
  2. all (near t . sum) ys,其中near t x的谓词陈述x“接近” t(半正式要求)。
卡拉法

递归函数可以写成

split :: [Double] -> [[Double]]
split x = go x [] 0
     where go [] _ _ = []
           go (x:xs) acc s | x+s>=3 = (acc++[x]) : go xs [] 0
                           | otherwise = go xs (acc++[x]) (s+x) 

split [1.0,2.0,0.5,2.5,3.0,1.1,2.0]
[[1.0,2.0],[0.5,2.5],[3.0],[1.1,2.0]]

迄今携带累加器和总和,根据总和决定结转或拆分。

注意,这是在构造“至少”,而不是在“附近”。因此,所有子列表都将大于或等于3.0。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章