国境の南

Ruby, Railsメイン

フィボナッチ数アルゴリズム

プロジェクトオイラーのこの問題を解いてみました。 https://projecteuler.net/problem=2

Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:

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

By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.

後置whileを使ったらスッキリかけました。

class Hoge
  def self.fibonacci(limit,ary=[1,2])
    ary << ary[-2..-1].inject(:+) while ary[-2..-1].inject(:+) < limit
    return ary.select { |elm| elm % 2 == 0 }.inject(:+)
  end
end

describe Hoge do
  describe '#fibonacci' do
    it 'Correct value' do
      expect(Hoge.fibonacci(4000000)).to eq 4613732
    end
  end
end

一応解説すると、配列に配列の最後2つの数字の和を放り込む、という動作を、limitが超えない限り続けるというもの。 このプロジェクトオイラー、会社の同期でわいわいやっているのですが 大分書き方の違いがみられて面白い。また、自分の癖みたいなものが見えてきます。 例えば自分の場合なら、配列を用意することが多くて、再帰やprocを活かすのに苦手意識があるのか全然使わないなど。

[別解] 友人はSQLで解いた

# with recursive fib(num1, num2) as (
( >     values(1, 2)
( >     union all
( >     select
( >         num2
( >         , num1 + num2
( >     from
( >         fib
( >     where
( >         num1 <= 4000000
( > )
- > select
- >     sum(num1)
- > from
- >     fib
- > where
- >     num1 % 2 = 0
- > ;
   sum   
---------
 4613732
(1 row)

Time: 0.565 ms

@InoHiro