For循环...永远

时间:2015-10-12 12:50:32

标签: ruby loops optimization

我有一个for循环,我希望永远增加。

我的代码:

for a in (0...Float::INFINITY).step(2)
    puts a
end

输出:

0.0
2.0
4.0
Etc. Always with "#{a}.0"

有没有办法将无穷大表示为整数,以便输出最后没有.0而不对循环内容进行任何操作?

附录

你能解释一下你的循环是如何工作的吗?我试图找到最有效的解决方案,因为这个循环将迭代无限,削减几毫秒将大大提高性能。

另外...

我会接受最短时间运行到1000000的解决方案

根据 benchmark @Sefan和while循环答案都需要相同的时间 Fruity while循环答案需要比较短,for循环答案为秒,但多个loop do答案需要更长时间。

由于其原因超出了本问题的范围,我创建了另一个问题,解决了为什么某些循环比其他循环更快(https://stackoverflow.com/questions/33088764/peddle-to-the-metal-faster-loop-faster)。

6 个答案:

答案 0 :(得分:10)

您可以在不传递限制的情况下使用Numeric#step

0.step(by: 2) { |i| puts i }

输出:

0
2
4
6
...

您还可以构建自己的Enumerator

step2 = Enumerator.new do |y|
  a = 0
  loop do
    y << a
    a += 2
  end
end

step2.each { |i| puts i }

答案 1 :(得分:5)

您可以使用while true

puts a = 0
puts a+=2 while true

顺便说一句,

  

有没有办法将无穷大表示为整数

答案 2 :(得分:4)

require 'bigdecimal'
(0..BigDecimal('Infinity')).step(2).each{ |n| puts n }

OR

require 'bigdecimal'
for a in (0...BigDecimal::INFINITY).step(2)
  puts a
end

答案 3 :(得分:4)

这就是循环方法的设计目的。 loop没有条件可以运行。它将无限期运行,退出的唯一方法是使用关键字break。 (或提出StopIteration

a = 0
loop { puts a += 2} 

这个循环将是无限的,因为没有指定break

如果需要,

break可以与其他答案如何使用while条件非常类似地指定:

a = 0 
loop do 
  puts a += 2
  break if a > 1_000_000
end

一旦loop的值超过1M,此a现在将退出。

据说@Stefan的答案更有效率,因为它不存储这个整数值或者必须执行任何额外的赋值,而是简单地从枚举器中产生数字并在之后丢弃它。这种用途的实用性更多地取决于您对此循环的实现和目的。

答案 4 :(得分:0)

试试这个:

$(document).on("action","element",function()

如果你想要无限循环,那么,不要将任何参数传递给arr = [0] arr.cycle(1000000) { |i| puts arr[0] +=2 }

cycle

答案 5 :(得分:0)

a = [-2]
puts a.unshift(a.shift+2) while 'loop forever'