【问题标题】:How to sum a number in a list如何对列表中的数字求和
【发布时间】:2018-10-02 14:57:21
【问题描述】:

我的问题是:

我有一个列表和一个数字,我想把这个数字加到列表中,这样我就可以做到这一点

Adding ls n = [x+n| x<-ls] 

它有效。

我的问题是我想根据列表的长度添加n+1、n+2、n+3。

如果我这样做了

let b = 0
Adding´ ls n = [x+adder n b| x<-ls] where adder n b= n+b,b++

它不起作用,因为 b 没有前进,所以如果我有 Adding´ [1,3,4] 3 = [4,7,9] 。

【问题讨论】:

  • adding xs n = zipWith (+) xs [n..] = [x+i | (x,i) &lt;- zip xs [n..]]。这是你的意思吗?

标签: haskell lazylist


【解决方案1】:

您可以使用Data.List.mapAccumL (mapAccumL :: Traversable t =&gt; (a -&gt; b -&gt; (a, c)) -&gt; a -&gt; t b -&gt; (a, t c)) 来完成此任务。

第一个参数是一个函数,它接受两个参数a(累加器)和n(列表项)并返回一个元组。在我们的例子中,我们将a(累加器)加1,并通过添加累加器映射当前元素n。结果是一个元组,其中第一项是累加器的最终状态,第二项是列表的最终状态。我们通过snd提取第二项。

Prelude> snd $ Data.List.mapAccumL (\a n -> (a+1,n+a)) 3 [1,3,4]
[4,7,9]

【讨论】:

  • 我不能使用任何模块,我只能使用“Learn You a Haskell for Great Good!”的前两章!
【解决方案2】:

递归地解决问题。向列表的 first 元素添加一个数字,然后使用下一个更大的数字在列表的 tail 上递归。重复,直到你没有数字。不是递增b,而是开始一个新的函数调用,其中b 具有更大的值。

adding [] _ = []
adding (x:xs) b = x + b : adding xs (b+1)

举个例子,考虑

adding [7, 10, 7, 5] 0 == 7 + 0 : adding [10, 7, 5] 1
                       == 7     : (10 + 1 : adding [7, 5] 2)
                       == 7     : 11      : (7 + 2 : adding [5] 3)
                       == 7     : 11      : 9      : (5 + 3 : adding [] 4)
                       == 7     : 11      : 9      : 8      : []
                       == [7, 11, 9, 8]

您可以在初始调用中将0替换为任何起始值n;递归调用总是递增它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-23
    • 2022-11-17
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多