我目前正在从项目Euler网站开展小型ruby项目。我被赋予了一项任务,即使斐波纳契数字小于4百万。不幸的是我的代码中有一个小错误,因为当我更改限制e.i.到100,它打印188而不是44。令人惊讶的是,这个程序给出了正确的答案,但我真的不知道我的代码是错误的。
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}"
答案 0 :(得分:2)
问题来自第二次迭代。当其中一个数字超过限制时(即当最后一个数字> 100时),您将停止生成斐波那契数字。
事实证明,在生成步骤之后,数组为[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
,这解释了您的错误结果188 = 144 + 44。
因此,只有当生成的最后一个元素是奇数时,您的代码才有效,这在Euler的问题测试中就是这种情况。为了纠正这种情况,将第二次迭代从a.each do ... end
更改为a[0...-1].each do ... end
以便迭代除最后一个元素之外的数组。
答案 1 :(得分:1)
顺便说一句,我建议您不要在此处使用数组。
您只是在浪费内存,而ruby在扩展内存上却浪费了时间(可以通过Array.new(ARRAY_SIZE)
解决)。
由于您实际上不需要斐波那契序列,因此您可以使用以下内容:
LIMIT = 4_000_000
a = 1
b = 1
next_number = a + b
sum = 0
while next_number < LIMIT
sum += next_number if next_number.even?
a = b
b = next_number
next_number = a + b # or next_number += a
end
UPD。噢,天哪,我不知道为什么这个问题出现在我的供稿中。很抱歉,您无法进行尸检:)