2012-02-29 3 views
12

В more ruby way of doing project euler #2, часть кодали что-то бесконечно много раз с индексом

while((v = fib(i)) < 4_000_000) 
    s+=v if v%2==0 
    i+=1 
end 

Есть ли способ изменить i += 1 в более функциональный стиль программирования построить?

Лучшее, что я могу думать о

Float::MAX.to_i.times do |i| 
    v = fib(i) 
    break unless v < 4_000_000 
    s += v if v%2==0 
end 

, потому что вы не можете вызвать .times на число с плавающей точкой.

+0

Что 'Float' должен сделать с ним в первую очередь? Это целые числа. –

+1

http://stackoverflow.com/questions/6373343/math-infinity-in-ruby-how-do-i-iterate-over-an-infinite-sequence –

+0

@DanielFischer: Потому что я не могу найти целочисленный эквивалент FLOAT :: MAX. –

ответ

12

Numeric.step имеет параметры бесконечности (предел) и 1 (размер шага).

1.step do |i| 
    #... 
end 

Для удовольствия, вы даже хотите попробовать

1.step.size 
+0

FWIW, похоже, работает для Ruby 2.1 и 2.2 и выше (я не пробовал 2.0) эквивалент Ruby 1.9.3: 1.step (Float :: INFINITY, 1) {| i | ...} – Gayle

10

Там в предопределенный (в 1.9.2) постоянная Float::INFINITY, так что вы могли бы написать

1.upto(Float::INFINITY) do |i| 
    ... 
end 

(Вы также можете использовать Enumerator и take_while, превратив проблему наизнанку, чтобы сделать его более похожим Haskell или Python , но take_while жадный и строит массив.)