Borbat - 1 year ago 73

Ruby Question

I'm currently working on small ruby projects from project Euler site. I was given a task to sum even fibonacci numbers that are less than 4 millions. Unfortunately there is a small bug in my code, because when I change the limit e.i. to 100, it prints 188 instead of 44. Surprisingly this program gives the right answer but i don't really know in what way my code is wrong.

`a=[]; a[0]=1; a[1]=1;`

i = 1

while a[-1] < 608

a[i+1]=(a[i] + a[i-1])

i +=1

end

x = 0

a.each do |num|

if num % 2 == 0

x += num

end

end

print "The sum of even Fibonacci number is: #{x}"

Answer Source

The problem comes from the second iteration. You are stopping the generation of Fibonacci numbers when one of the numbers cross the limit (ie when the last number is > 100).

It turns out that after the generation step, the array is `[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]`

, this explains your wrong result 188 = 144+44.

So, your code works only when the last element generated is odd, which is the case in Euler's problem test. In order to correct that, change your second iteration from `a.each do ... end`

to `a[0...-1].each do ... end`

In order to iterate through the array except the last element.