Problem 2

問題

フィボナッチ数列の項は直前の2項の和である。 最初の2項を 1, 2 とすれば、最初の10項は以下のようになる。

 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

400万以下の項のうち、偶数項の総和を求めよ。

回答

まずRubyPythonで解いてみる。

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学ぶとRubyPythonの書き方も変わる気がする。
そしてRubyで無限ストリームほしい![0..]とか書きたい!


Rubyで遅延Enumerable作ってる方がいたので参考にさせて頂きます。

github - antimon2/enumerable_lz