我正在尝试学习 Ruby,并且正在解决一些 Project Euler 问题。我解决了像这样:
def fib(n)
return n if n < 2
vals = [0, 1]
n.times do
vals.push(vals[-1]+vals[-2])
end
return vals.last
end
i = 1
s = 0
while((v = fib(i)) < 4_000_000)
s+=v if v%2==0
i+=1
end
puts s
虽然这有效,但它似乎不太像 Ruby 那样——我无法像第一个答案那样想出任何好的纯 Ruby 答案(puts (0..999).inject{ |sum, n| n%3==0||n%5==0 ? sum : sum+n }
).
对于一个好的解决方案,为什么不创建一个斐波那契数生成器,例如Prime
或者Triangular
例子一给了这里 https://stackoverflow.com/questions/3024452/more-ruby-like-solution-to-this-problem/3026213#3026213.
由此,您可以使用niceEnumerable
处理问题的方法。您可能想知道斐波那契偶数是否也有任何模式。
编辑您的问题以发布您的解决方案...
注意:有比枚举更有效的方法,但它们需要更多的数学运算,不会像这样清晰,并且只有在 400 万更高的情况下才会发光。
由于 demas' 发布了一个解决方案,这里有一个清理版本:
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
end
end
end
end
puts Fibo.take_while { |i| i < 4000000 }.
select(&:even?).
inject(:+)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)