Haskell维基上的Project Euler#2解决方案
我刚刚开始读一点关于Haskell的书,只写了一点点代码,这意味着我是一个完全的Haskell新手 项目Euler问题#2如下: 斐波那契序列中的每个新项都是通过将前两项相加生成的。从1和2开始,前10个术语将是: 1、2、3、5、8、13、21、34、55、89 通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和 我自己创建斐波那契数的第一步很幼稚(而且很慢/很昂贵)。失败后,我去寻找解决办法。这个有好几种,我觉得第一种非常优雅,但我不完全理解。这是我的代码(where/fibs结构被拆分为可读性和修补性)Haskell维基上的Project Euler#2解决方案,haskell,Haskell,我刚刚开始读一点关于Haskell的书,只写了一点点代码,这意味着我是一个完全的Haskell新手 项目Euler问题#2如下: 斐波那契序列中的每个新项都是通过将前两项相加生成的。从1和2开始,前10个术语将是: 1、2、3、5、8、13、21、34、55、89 通过考虑Fibonacci序列中值不超过400万的项,求偶数值项之和 我自己创建斐波那契数的第一步很幼稚(而且很慢/很昂贵)。失败后,我去寻找解决办法。这个有好几种,我觉得第一种非常优雅,但我不完全理解。这是我的代码(where/fi
p::Integer
p=sum[x | x函数的工作原理是将列表左移1,然后将其添加到自身中
你告诉它,fibs=1:1:something
,从中可以看出tail-fibs=1:something
。所以zipWith(+)fibs(tail-fibs)
以1+1=2开始
现在haskell知道了fibs=1:1:2:something
,它可以无限地继续为您生成更多的术语。fibs
函数通过将列表左移一个并将其添加到自身中来工作
你告诉它,fibs=1:1:something
,从中可以看出tail-fibs=1:something
。所以zipWith(+)fibs(tail-fibs)
以1+1=2开始
现在haskell知道了fibs=1:1:2:something
,它可以无限期地继续为您生成更多的术语。这个问题在这里得到了很好的回答:@ErikVesteraas谢谢链接,我专门搜索了与euler相关的问题。这个问题在这里得到了很好的回答:@ErikVesteraas谢谢在链接中,我专门搜索了与euler相关的问题。
p :: Integer
p = sum [ x | x <- takeWhile (< 4000000) fibs, even x]
fibs :: [Integer]
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
main :: IO()
main = do
print $ p
-- BEWARE print $ fibs