mat*_*tic 3 haskell functional-programming list cumulative-sum
我需要创建或知道Haskell中是否有一个函数允许您从列表中添加项目.所以,例如:
cumulativeAmount :: [Integer] -> [Integer]
cumulativeAmount [1,2,5,8,8,0,4,2] = [1,3,8,16,24,24,28,30]
cumulativeAmount [1,4,7,0,5] = [1, 1+4, 1+4+7, 1+4+7+0, 1+4+7+0+5] = [1,5,12,12,17]
Run Code Online (Sandbox Code Playgroud)
我尝试使用map和scanl函数,但我没有得到我想要的东西,因为我添加了所有元素.
这正是以下目的scanl1 :: (a -> a -> a) -> [a] -> [a]:
Prelude> scanl1 (+) [1,2,5,8,8,0,4,2]
[1,3,8,16,24,24,28,30]
Run Code Online (Sandbox Code Playgroud)
scanl1将函数f :: a -> a -> a(此处(+))作为输入,以及as 的列表.它构造一个列表,其中第一个项目是列表的第一个项目.这是累加器的第一个值.然后对于每个值,通过f使用累加器和列表的下一个值调用来更新累加器,然后生成该项.
因此,在scal1 (+) [1,2,5]我们发出的第一个项目的情况下1,我们还将累加器设置为1.下一个项目是2,所以我们调用(+) 1 2(这是3),这是结果和新的累加器,接下来我们调用(+) ((+) 1 2) 5(这是8)等.
但我认为这更好,作为使用递归的练习.就像之前我们使用累加器一样.我们可以通过引入一个额外的函数来实现它,其中累加器是我们通过递归调用(和更新)的函数.所以在这种情况下它看起来像:
cumulativeAmount :: [Integer] -> [Integer]
cumulativeAmount [] = ...
cumulativeAmount (x:xs) = go x xs
where go x xs = ...
Run Code Online (Sandbox Code Playgroud)
所以这里go(x)的第一个参数是累加器.我把它留作练习用递归来实现它.
| 归档时间: |
|
| 查看次数: |
374 次 |
| 最近记录: |