Borbat - 4 months ago 6

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

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.

Source (Stackoverflow)

Comments