2

对于 Project Euler 问题 #1,GHCI 中最短的单行代码是:

sum [3,6..9999] + sum [5,10..9999] - sum [15,30..9999]

解决问题后我发现这是一个非常血腥的方式。但是,由于我是 Haskell 的新手,我决定看看我是否可以把它放在一起作为一组函数返回类似的答案 x 的任何值(步长值,即上面的 '3' 或 '5'] 和y(列表的长度)。

我在这里完成了第一个功能:

sumList :: (Enum a, Num a) => a -> a -> a
sumList a b = sum[a,a+a..b]

接下来我试图利用这个功能并做一些事情sumListTotals [3,5] 1000,例如从问题中。这将全部sumList用于列表中的每个项目,然后减去重复的数字(即 [15,30..1000] 使用示例。

我不是在寻找真正解决它的人,而是帮助我指出正确的方向。

我试图使用如下map功能:

sumListTotals list = map f list
    where f = sumlist a b

但是,我不确定如何从列表中取出这些东西,或者我是否做了类似的事情,sumListTotals ([3,5],1000)或者我完全走错了路?

根据@user5402 更新:

module Project1 where

import Data.List (union)

sumListTotals :: (Enum a, Eq a, Num a) => a -> a -> a -> a
sumListTotals a b c = sum $ union [a,(*2)a..c] [b,(*2)b..c]
4

1 回答 1

1

你在正确的轨道上:

sumListTotals a b c = sum [a,a+a..c] + sum [b,b+b..c] - sum[m,m+m..c]
  where m = ...???...

我会让你弄清楚它的定义,m因为这实际上是一个数论问题,而不是一个 Haskell 编程问题。

显然a = 3, b = 5 m应该是15。但是应该m是为了a = 3, b = 3什么?

于 2013-04-25T01:57:04.610 回答