首先我知道在fibonacci上使用递归有很多问题,但我的问题更具体地说明我如何将我的python代码实现到我的ruby代码中,而我的更多只是循环遍历每个元素解决方案。例如,这是我的工作python代码,以获得第1000个斐波那契元素
from math import sqrt
primeCount = 1
num = 1
while(primeCount < 1000):
num+=2
for k in range(2,1+int(sqrt(num+1))):
if num%k ==0:
break
else:
primeCount+=1
print num
正如您所看到的,如果我们决定break
,else
语句将永远不会实际处理,即使它位于不同的块中。
当我在Ruby中尝试类似的东西时。
num = 1
primeCount = 1
while(primeCount < 1000)
num+=2
(1..Math.sqrt(num+1)).each do |k|
if num%k == 0
break;
end
end
else
primeCount+=1
end
end
我应该在end
关键字的位置出错。这是有道理的。我的问题是,当primeCount+=1
为真时,我有没有办法让我的循环跳过num%k == 0
?我有点困惑,并且已经考虑过这个问题,并希望实现类似于我在python中所做的解决方案。
答案 0 :(得分:2)
注1 :标题提到Fibonacci序列,但您的代码清楚地生成素数,而不是Fibonacci数。
注意2 :看起来你的Ruby代码中有一个错误,范围应该从2开始,而不是从1开始。毕竟,所有数字都可以被1整除。我已经修复了下面的代码。
在Ruby中,each
通常返回self
,但如果它被break
停止,则返回nil
(或break
指定的值作为参数})。所以你可以这样做:
num = primeCount = 1
while primeCount < 1000
num+=2
primeCount+=1 if (2..Math.sqrt(num+1)).each do |k|
break if num%k == 0
end
end
但是如果你想要一个真正的Ruby解决方案,那么它就是:
require 'prime'
Prime.take 1000