16

做项目 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浮点数。

4

3 回答 3

18

Numeric.step具有 infinity(极限)和 1(步长)的默认参数。

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

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

1.step.size
于 2015-10-05T13:30:37.973 回答
11

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

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

(你也可以使用Enumeratorand take_while,把问题从里到外让它看起来更像 Haskell 或 Python,但take_while它是贪婪的并且会构建一个数组。)

于 2012-02-29T23:12:54.117 回答
4

Ruby 2.5 引入了开放式 Range:

(1..).each do |i|
  #...
end
于 2019-02-01T16:28:20.960 回答