1

我正在尝试使用 Project Euler 系列问题来提高我的 Ruby 技能,我想知道为什么这段代码不适用于这个问题:“即使是斐波那契数,问题 2”

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。

我的代码:

def fibo(n)
  first, second, sequence = 0,1,[]
  for e in n
    first, second = second, first + second
    sequence << e if e%2 == 0
  end
  sequence.inject(:+)
end

puts fibo(4000000)

任何帮助,将不胜感激!

4

2 回答 2

4

在行中:

for e in n

4,000,000 被替换为 n,所以你说:

for e in 4000000

这不是一个有效的语句 - 你不能迭代一个整数。

如果您想遍历从 0 到 n 的所有值,请尝试:

for e in (0..n)

这将遍历0 到 n范围内的值。

然而,这里还有一个更深层次的问题。看起来您想要迭代到值 4000000,但您的代码将迭代前 4000000 个斐波那契数,这比您想要的要多得多。您可能要考虑说:

while second <= 4000000
于 2013-10-04T03:24:18.377 回答
2

如果您刚开始使用 Ruby,我建议您查看Ruby Koans 。这是一种习惯语言方式的有趣方式。

也就是说,您的代码没有正确计算斐波那契,它没有对斐波那契数求和,并且还有一些其他错误(for e in n无效,因为n不是 Enumerator 类型)。像这样修复它:

def fibo(n)
  first, second, sum = 0, 1, 0
  loop do
    first, second = second, first + second
    sum += second if second%2 == 0
    break if second >= n
  end
  sum
end
于 2013-10-04T03:10:50.933 回答