Какой интересный вопрос!Это вдохновило меня и на решение этой проблемы.Вот мое решение.
Сначала подготовительная работа:
class Enumerator
def lazy_select
Enumerator.new do |y|
each do |el|
y.yield(el) if yield el
end
end
end
alias_method :lazy_find_all, :lazy_select
end
module Enumerable
def sum
reduce(:+)
end
end
module Math
ROOT5 = Math.sqrt(5)
PHI = 0.5 + ROOT5/2
def self.fibonacci(n)
Integer(0.5 + PHI**n/ROOT5)
end
end
class Integer
def fibonacci
Math.fibonacci(self)
end
end
Теперь Enumerator
, который генерирует бесконечную последовательность чисел Фибоначчи:
fibs = Enumerator.new do |y|
n = -1
loop do
y.yield (n += 1).fibonacci
end
end
Ихорошо, что теперь мы можем напрямую выразить исходное утверждение задачи в коде:
Найти сумму всех четных членов в последовательности, которые не превышают четырех миллионов.
puts fibs.lazy_find_all(&:even?).take_while {|n| n <= 4_000_000 }.sum
Я думаю, что это гораздо более рубиновый способ решения проблемы.Вы пишете в своем вопросе, что вы ужасны с Руби.Но это на самом деле не проблема.Проблема real в том, что с C у вас все хорошо!Другими словами, настоящая проблема в том, что вы просто не пишете на Ruby, вы пишете на языке C с синтаксисом Ruby.
Два хороших примера:
y % 2 == 0
и
x = x ^ y
y = x ^ y
x = x ^ y
В Ruby их можно написать
y.even?
и
x, y = y, x