用索引无限次地做一些事情

And*_*imm 16 ruby infinity lazy-sequences

做项目euler#2的更多ruby方式中,部分代码是

while((v = fib(i)) < 4_000_000)
  s+=v if v%2==0
  i+=1
end
Run Code Online (Sandbox Code Playgroud)

有没有办法改变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
Run Code Online (Sandbox Code Playgroud)

因为你不能调用.times浮点数.

ste*_*lag 16

Numeric.step的默认参数为无穷大(限制)和1(步长).

1.step do |i|
  #...
end
Run Code Online (Sandbox Code Playgroud)

为了好玩,您甚至可以尝试一下

1.step.size
Run Code Online (Sandbox Code Playgroud)


Jos*_*Lee 10

有一个预定义的(在1.9.2中)常量Float::INFINITY,所以你可以写

1.upto(Float::INFINITY) do |i|
  ...
end
Run Code Online (Sandbox Code Playgroud)

(您也可以使用Enumeratortake_while,将问题内部化,使其看起来更像Haskell或Python,但是take_while贪婪并构建一个数组.)


ste*_*lag 5

Ruby 2.5 引入了开放式 Range:

(1..).each do |i|
  #...
end
Run Code Online (Sandbox Code Playgroud)