【发布时间】:2015-01-23 04:21:52
【问题描述】:
你可能知道欧拉项目第 5 题:求能被 1 到 20 整除的最小数。
我应用的逻辑是“从大于列表中最大值的第一个数字(20)开始,并且可以被它整除,即 40”,步长为 20(最大数字)
我使用列表推导来做到这一点,但它很蹩脚。
pe5 = head [x|x<-[40,60..],x`mod`3==0,x`mod`4==0,x`mod`6==0,x`mod`7==0,x`mod`8==0,x`mod`9==0,x`mod`11==0,x`mod`12==0,x`mod`13==0,x`mod`14==0,x`mod`15==0,x`mod`16==0,x`mod`17==0,x`mod`18==0,x`mod`19==0]
也许我们可以使用 zipWith 和 filter 做得更好吗?
澄清一下,这不是家庭作业。我这样做是为了让我的大脑围绕 Haskell。 (到目前为止我输了!)
:谢谢大家
我认为这是一种更明智的方法(可能还有数千种更好的方法,但这已经足够了)
listlcm'::(Integral a)=> [a] -> a
listlcm' [x] = x
listlcm' (x:xs) = lcm x (listlcm' xs)
【问题讨论】:
-
没有算法变化,只是一个更短的版本
head [x | x <- [40,60..], all (\y -> xrem` y == 0) [1..20]]` -
如果你想要一个更好的算法,你可以考虑
lcm -
@is7s 我没有要求更好的算法,但感谢您提供的线索,一切都在“as”处理程序中?
-
顺便说一句,这个问题的标题有点非描述性(“这个”部分可以再澄清一点)
-
@hvr thanx,从现在开始我会更精确
标签: haskell