Project Euler Problem 2 – Even Fibonacci Numbers


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.

To solve this problem, I first started by writing a simple test case to test that this would work with numbers under 10. We know that our answer would be 10 since 2 and 8 are the only even numbers in the Fibonacci sequence. The test instantiates a Problem2 solver object with 10 as the parameter. We solve and should expect 10 as the answer.

class Problem2Test < Minitest::Unit::TestCase
  def test_even_fibonacci_numbers
    solver = :under => 10
    answer = solver.solve
    assert_equal 10, answer

The test should be failing since we haven’t implemented the class yet. The next step is to implement the class.

class Problem2
  def initialize options
    @under = options[:under]

  def solve
    previous = 0
    current = 1
    sum = 0
    loop do
      temp = current
      current += previous
      previous = temp
      break if current >= @under
      sum += current if current % 2 == 0

In the solve method, we start by declaring 3 variables, previous, current, and sum. In the loop, we store the current as temp, which we will use to set the previous later on. We add the previous to the current and then set the previous to the temp. We stop the loop if the current is equal to or greater than the under instance variable we initialized earlier. We add current to the sum if it is even. We return the sum.

Then we solve for the answer:

puts => 4000000).solve