[已解决] haskell 如何高效地计算部分和?

发布于 2022-08-10 06:19:10 字数 380 浏览 8 评论 9

对于一个整数数组 x,现在要计算它其中每个元素所在位置之前的各个元素的和,
例如,
x = [1,2,3,4,5,6,7]
要得到如下的结果
s = [0,1,3,6,10,15,21]

用 c 的方法,只要计算 6 次加法就可以得到以上结果。
用 haskell, 能这样高效地做吗?

我想到的很直接的做法是,

subsum x = map sum $ init $ inits x

但是觉得可能做会多余的计算。

不知道各位以为如何。谢谢了先。

[ 本帖最后由 drunkedcat 于 2009-3-29 20:52 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

浅唱ヾ落雨殇 2022-08-21 22:03:18

原帖由 drunkedcat 于 2009-3-29 21:37 发表
不是第一个零,是最后一个数,也就是全体元素的和,这个是不需要的。

需要多少就 take 多少不就得了。

拥抱没勇气 2022-08-21 22:03:18

大家的方法都很绚。
我来个笨的。
先写成scheme 一会再来翻译。。。。

  1. (define (accumulated-sum lon)
  2.   (cond
  3.    [(empty? (cdr lon)) lon]
  4.    [else (accumulated-add
  5.           (car lon)
  6.           (accumulated-sum (cdr lon)))]))
  7. (define (accumulated-add n los)
  8.   (cons (+ n (car los)) los))
  9. (accumulated-sum '(4 3 2 1))
  10. >(10 6 3 1)

复制代码

左耳近心 2022-08-21 22:03:17

原帖由 drunkedcat 于 2009-3-29 20:47 发表

MMMIX 一出手,更加简练,佩服,学习ing。只是要加上一个 init。

嫌那个 0?那用 scanl1 吧

  1. Prelude> scanl1 (+) [0..7]
  2. [0,1,3,6,10,15,21,28]

复制代码

执妄 2022-08-21 22:03:17

不是第一个零,是最后一个数,也就是全体元素的和,这个是不需要的。

初与友歌 2022-08-21 22:03:12

原帖由 MMMIX 于 2009-3-29 20:40 发表

Prelude> scanl (+) 0 [1..7]
[0,1,3,6,10,15,21,28]

MMMIX 一出手,更加简练,佩服,学习ing。只是要加上一个 init。

悲喜皆因你 2022-08-21 18:37:37

原帖由 drunkedcat 于 2009-3-29 19:42 发表
对于一个整数数组 x,现在要计算它其中每个元素所在位置之前的各个元素的和,
例如,
x = [1,2,3,4,5,6,7]
要得到如下的结果
s = [0,1,3,6,10,15,21]

  1. Prelude> scanl (+) 0 [1..7]
  2. [0,1,3,6,10,15,21,28]

复制代码

峩卟喜欢 2022-08-21 14:17:49

原帖由 win_hate 于 2009-3-29 19:59 发表
这个怎么样?

Prelude> let s=0:[x+y|x

要带这个参数

-XParallelListComp

win_hate  兄说的正是,我也刚好想到这里了。

subsum xs = 0 : [x+y | (x,y) <- zip xs $ subsum xs]

朱染 2022-08-20 16:36:59

c 中可以优化算法,进而提高程序运行效率
haskell 中需要考虑优化算法吗?
编译器会优化吧?

缱倦旧时光 2022-08-14 01:59:29

这个怎么样?

  1. Prelude> let s=0:[x+y|x<-[1..7]|y<-s]
  2. Prelude> s
  3. [0,1,3,6,10,15,21,28]
  4. Prelude>

复制代码

要带这个参数

-XParallelListComp

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文