【发布时间】:2019-03-26 19:00:30
【问题描述】:
对于用户s=[x1,x2,...,xk]给定的列表,我需要计算总和
x1 * (x2+x3+...x4)
+ (x1+x2) * (x3+x4+...xk)
+ ...
+ (x1+x2+...+x(k-2)) * (x(k-1) + xk)
+ (x1+x2+...+x(k-1)) * xk
来自函数[Int]->Int
请参阅下图中的数学公式以更好地理解:
https://imgur.com/gallery/Oqgpkcu
只是尝试了很少的事情,例如计算列表的总和减去最后一个元素。 顺便说一句,我必须通过使用列表和非常基本的函数(head、tail、init)来实现所有这些
xsum :: [Int] -> Int
xsum s = sumIntList (init s)
sumIntList :: [Int] -> Int
sumIntList (h:t) = h + sumIntList t
sumIntList [] = 0
调用函数应该产生的一些结果是:
xsum [4,5,8]
124
xsum [1..100]
341665830
感谢阅读!
【问题讨论】:
-
xsum s = sum (zipWith (*) (map sum (inits s)) (map sum (tails s))) -
再次感谢您的意见!正如我上面所说,我无法使用 zipWith 和 map (也是 sum)之类的函数来实现它,因为我只能使用非常基本的函数。但是我看看我能不能用你提供的代码做点什么! :-)
-
当然,所有这些函数的源代码都是公开的,所以你可以复制粘贴来重新实现你不可用的函数。
-
您在一篇冗长的帖子中隐藏了您的要求。 :) 我没看到。也许它应该以某种方式强调......?
-
问题是什么?没有问题。