您可能知道项目 Euler 问题 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 -> x`mod`y == 0) [2..20] ]
但是,这里真正需要的不是精巧的Haskell,而是更智能的算法。提示:使用算术基本定理。然后,您的Haskell解决方案将以标准的爱乐美筛网示例开始。
关于haskell - 欧拉计划 : A (much) better way to solve problem #5?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6968076/