Aaron Yodaiken Aaron Yodaiken - 1 year ago 62
Ruby Question

more ruby way of doing project euler #2

I'm trying to learn Ruby, and am going through some of the Project Euler problems. I solved problem number two as such:

def fib(n)
return n if n < 2
vals = [0, 1]
n.times do
return vals.last
i = 1
s = 0
while((v = fib(i)) < 4_000_000)
s+=v if v%2==0
puts s

While that works, it seems not very ruby-ish—I couldn't come up with any good purely Ruby answer like I could with the first one (
puts (0..999).inject{ |sum, n| n%3==0||n%5==0 ? sum : sum+n }

Answer Source

For a nice solution, why don't you create a Fibonacci number generator, like Prime or the Triangular example I gave here.

From this, you can use the nice Enumerable methods to handle the problem. You might want to wonder if there is any pattern to the even Fibonacci numbers too.

Edit your question to post your solution...

Note: there are more efficient ways than enumerating them, but they require more math, won't be as clear as this and would only shine if the 4 million was much higher.

As demas' has posted a solution, here's a cleaned up version:

class Fibo
  class << self
    include Enumerable

    def each
      return to_enum unless block_given?
      a = 0; b = 1
      loop do
        a, b = b, a + b
        yield a

puts Fibo.take_while { |i| i < 4000000 }.