【问题标题】:How can I sum the middle elements of an expanding list in Haskell?如何在 Haskell 中对扩展列表的中间元素求和?
【发布时间】:2020-12-01 02:44:30
【问题描述】:

到目前为止,我知道如何从列表的末端扩展列表,但由于第一个条件,即加倍单例,它们最终会加倍。这样的代码是否有意义:

sumExpand :: [Integer] -> [Integer]

sumExpand l = expand l []
  where
    expand [] a     = a
    expand (x:[]) a = x: expand [] (x:a)
    expand (x:xs) a = expand (x:a) (expand xs a)

让我处理它的输出:

[1,1,2,2,3,3] from [1,2,3]
instead of [1,3,5,3]

后者是我的愿望?以下是我如何找到包含两个元素的列表的临时解决方案:

expand (x:xs) a = x: tail (expand (map (x+) xs) (last xs:a))

输出:

*Main> sumExpand [1,2]
[1,3,2]
*Main> sumExpand [1,2,3]
[1,7,4,3]

编辑:基本上,我希望算法像这样工作:[a, b, c] => [a, a+b, b+c, c]

【问题讨论】:

  • 您的算法究竟应该做什么?你有什么问题?
  • 您想在每对之间插入每个相邻对的总和吗? [a, b, c] => [a, a+b, b, b + c, c]?
  • 我想做的是:[a, b, c] => [a, a+b, b+c, c]。它与@chepner 建议的基本相同,但没有重复。
  • 列表中超过 3 个元素怎么样?比如说,[a, b, c, d] => [a, a+b, b+c, c+d, d]?
  • 我有解决方案,但你能给我一些关于如何提高我的研究或解决问题的能力的建议吗?当这样的事情发生时?我刚投了反对票,我想改进。提前致谢。

标签: list haskell sum expand


【解决方案1】:

基本上,您想要计算输入列表和它的移位版本之间的组件总和:

a   b   c   d   e
    a   b   c   d   e
---------------------------
a  a+b b+c c+d d+e  e

用 0 填充每个空槽(0:xx++[0]),您只需要 zipWith

> (\x -> zipWith (+) (0:x) (x++[0])) [1,2,3]
[1,3,5,3]

【讨论】:

  • 如果性能是一个问题,应该写成\x -> zipWith (+) (x++[0]) (0:x)。这没什么大不了的,但让zipWith(++) 融合很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多