打破循环(获得Fibonacci序列中的术语)

时间:2016-09-03 04:10:39

标签: ruby

首先我知道在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

正如您所看到的,如果我们决定breakelse语句将永远不会实际处理,即使它位于不同的块中。

当我在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中所做的解决方案。

1 个答案:

答案 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