Подтвердить что ты не робот

Делать что-то бесконечно много раз с индексом

В больше рубинового способа выполнения проекта 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 по числу с плавающей запятой.

4b9b3361

Ответ 1

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

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

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

1.step.size

Ответ 2

Theres предопределенная (в 1.9.2) константа Float::INFINITY, поэтому вы можете написать

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

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