list - 如何在 Haskell 中对扩展列表的中间元素求和?
问题描述
到目前为止,我知道如何从它的末端扩展一个列表,但是由于第一个条件,即加倍单例,它们最终会加倍。像这样的代码是否有意义:
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 d e
a b c d e
---------------------------
a a+b b+c c+d d+e e
0:x
用 0(和)填充每个空槽x++[0]
,您只需要zipWith
> (\x -> zipWith (+) (0:x) (x++[0])) [1,2,3]
[1,3,5,3]
推荐阅读
- reactjs - 有没有办法访问谷歌照片所做的照片分类?或者最近浏览过的照片?
- yii2 - 调用未知方法:yii\db\Command::select()
- ruby-on-rails - 使用多态关联来确定所有权?或者我应该在桌子上留下一个空列?
- vue.js - 如何使用与普通路由不同的模板处理 vue-router 的 404 错误
- javascript - 在我的主要组件中嵌套路由的问题
- java - 我无法处理 A 片段中的 RecyclerView onClick 事件
- html - 将图像高度放大到最大高度的最佳方法是什么?
- c++ - 映射插入(const_iterator 提示,值)用法
- python - Scrapy 推送到 Heroku 得到错误:推送被拒绝,无法编译 Python 应用程序
- powershell - 我想通过检查嵌套文件夹将具有选定扩展名的文件移动到另一个文件夹中。谁能帮助我