2015-10-12 67 views
1

我有一个for循环,我想永远增加。For loop ...永远

我的代码:

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环答案采取相同的时间ammount的解决方案Fruitywhile循环答案需要更短一些,for循环答案在第二位,但多个loop do答案需要更长的时间。

由于之所以不在这个问题的范围之内,我创建了另一个问题来解释为什么一些循环比其他循环更快(https://stackoverflow.com/questions/33088764/peddle-to-the-metal-faster-loop-faster)。

+2

“[S]因斯这个循环将是无穷迭代,几毫秒削减将大大提高性能“ - 我不明白这一点。无限的过程永远不会结束。每次迭代的性能差异不会有任何区别。 – sawa

+0

@sawa这是我的代码的一个非常简化的版本,我试图检查每个数字,循环达到一定的特征,并且我希望循环尽可能快地检查数字。因此,如果每个被检查的号码花费的毫秒数少于1毫秒,它就会节省一秒钟,并且会检查数万亿的数字。 – thesecretmaster

+0

@sawa它会在某个时候终止。没有循环会实际运行无穷大,因为对于所有意图和目的,任何无限循环都将被终止。 – thesecretmaster

回答

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 } 
+0

你可以格式化成一个for循环? – thesecretmaster

+0

@thesecretmaster您可以在0.step中编写'for i(by:2)' – Stefan

+0

在Ruby 2.0的['Numeric#step']中执行此操作的任何简单方法(http://ruby-doc.org/core -2.0.0/Numeric.html#方法-i步)? –

5

您可以使用while true为:

puts a = 0 
puts a+=2 while true 

BTW,

有没有什么方式来表达无穷大的整数

NO

+0

虽然有效,但质量检查人员希望增加2;)编辑 –

+0

。谢谢:) \ – shivam

+0

这个循环会在每次迭代后检查'true == true'吗? – thesecretmaster

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 
4

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

a = 0 
loop { puts a += 2} 

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

break如果需要,可以非常相似指定给其他的答案是如何使用的,而条件:

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

loop现在将退出一旦a价值超过100万。

这就是说@斯蒂芬的答案是更有效的,因为它不存储这个整数值或必须执行任何额外的任务,而是从一个枚举器简单地产生该数字,然后丢弃它。这个更有用的是你的实现和这个循环的目的。

+0

'loop'不是一个关键字,它只是一个像其他任何方法一样的方法。 –

+0

@JörgWMittag我道歉回答修改为*“循环方法”* – engineersmnky

0

试试这个:

arr = [0] 
arr.cycle(1000000) { |i| puts arr[0] +=2 } 

如果你想死循环,那么,不要将任何参数传递到cycle

arr = [0] 
arr.cycle { |i| puts arr[0] +=2 } 
0
a = [-2] 
puts a.unshift(a.shift+2) while 'loop forever'