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

时间:2012-02-29 23:01:23

标签: ruby infinity lazy-sequences

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

3 个答案:

答案 0 :(得分:16)

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

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

为了好玩,您甚至可能想尝试

1.step.size

答案 1 :(得分:10)

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

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

(您也可以使用Enumeratortake_while,将问题彻底解决,使其看起来更像Haskell或Python,但take_while贪婪并构建数组。)< / p>

答案 2 :(得分:3)

Ruby 2.5引入了开放式范围:

angular.json