Skip to content

Instantly share code, notes, and snippets.

@tinomen
Created September 25, 2013 02:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tinomen/6694488 to your computer and use it in GitHub Desktop.
Save tinomen/6694488 to your computer and use it in GitHub Desktop.
positive Fibonacci sum
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.
@aamax
Copy link

aamax commented Sep 25, 2013

describe "fibonacci" do
  it "should return 10 for 8" do
    sum_even_fibonacci(8).should == 10
  end

  it "should return 1 as the first fibonacci term" do
    fib = FibonacciSequence.new
    fib.next.should == 1
  end

  it "should return 2 as the second fibonacci term" do
    fib = FibonacciSequence.new
    fib.next.next.should == 2
  end
end

class FibonacciSequence
  attr_reader :last, :current

  def initialize(seed1 = 0, seed2 = 1)
    @last = seed1
    @current = seed2
  end

  def next
    temp = @last
    @last = @current
    @current = @last + temp
    @current
  end
end

def sum_even_fibonacci(val)
  sum = 0
  fib = FibonacciSequence.new
  temp = fib.next
  while temp <= val do
    if temp % 2 == 0
      sum += temp
    end
    temp = fib.next
    icnt += 1
  end
  sum
end

puts sum_even_fibonacci(4000000)

#=> 4613732

@justinlyman
Copy link

terms = [1,2]
even_numbers = [terms.last]
begin
  next_t = terms.inject(:+)
  terms.push(next_t).shift
  even_numbers << terms[1] if terms[1] < 4_000_000 && terms[1] % 2 == 0
end while terms[1] < 4_000_000

puts even_numbers.inject(:+)

@scizo
Copy link

scizo commented Sep 25, 2013

previous, current = 1, 2
sum = 0

while current <= 4_000_000
  sum += current if current.even?
  previous, current = current, previous + current
end

puts sum

@rickarubio
Copy link

fib_array = [1, 2]
current_num = 2
previous_num = 1
MAX_VALUE = 4_000_000

while fib_array.last.to_i < MAX_VALUE
  fib_array << (current_num + previous_num)
  previous_num = current_num
  current_num = fib_array.last
end
fib_array.pop if fib_array.last.to_i >= MAX_VALUE

# We now have good data to work with
answer = 0
fib_array.each do |i|
  answer += i if i % 2 == 0
end
# sum of all even fibonacci #s in the sequence from 1 to 4 mil
puts answer

@aemadrid
Copy link

Took Jake's code and made it easier to understand

terms = [1, 2]
even_numbers = [terms.last]
ceiling = 4_000_000

begin
  next_t = terms.inject(0) { |t, x| t + x }
  terms = [terms.last, next_t]
  if terms.last < ceiling && terms.last.even?
    even_numbers << terms.last
  end
end while terms.last < ceiling

puts even_numbers.inject(0) { |t, x| t + x }

@scizo
Copy link

scizo commented Sep 25, 2013

def fibs
  Enumerator.new do |y|
    a, b = 0, 1
    loop do
      y << a
      a, b = b, a + b
    end
  end
end

puts fibs.take_while{|n| n <= 4E6}.select(&:even?).reduce(:+)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment