Problem 2
問題
フィボナッチ数列の項は直前の2項の和である。 最初の2項を 1, 2 とすれば、最初の10項は以下のようになる。
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
400万以下の項のうち、偶数項の総和を求めよ。
回答
loop.inject([0, 0, 1]) {|(sum, a, b), _| raise StopIteration if a > 4_000_000 [ sum + a.even? ? a : 0, b, a + b ] }[0]
def fibs( max ): a, b = 0, 1 while b <= max: yield b a, b = b, a + b sum([ x for x in fibs(4000000) if x % 2 == 0 ])
手続き型の解法+ジェネレータ、畳込み演算、リスト内包表記など使ってみた。
手続き型と関数型がごっちゃだけど、そこのバランス感覚を身につけたい。
Haskellは調べてみたけどかっこよすぎて別次元。。。
The Fibonacci sequence - Haskell Wiki
sum [x | x <- takeWhile (< 4000000) fibs, even x] where fibs = 1 : 2 : zipWith (+) fibs (tail fibs)
遅延評価学ばねば。Haskell学ぶとRubyやPythonの書き方も変わる気がする。
そしてRubyで無限ストリームほしい![0..]とか書きたい!
Rubyで遅延Enumerable作ってる方がいたので参考にさせて頂きます。