我从电脑发烧友那里看到了这个关于惰性计算的精彩视频。在视频中,他们展示了一段非常漂亮的 Python 代码,它将使用筛法“懒惰”地计算素数
def nats(n):
yield n
yield from nats(n+1)
def sieve(s):
n = next(s)
yield n
yield from sieve(i for i in s if i%n!=0)
当您实际实现代码来计算大量素数时,问题就出现了。因为您是递归搜索,所以相对较快地达到递归深度。我只能计算一个素数2281
如果我修改代码以摆脱第一个函数的递归:
def nats(n):
while True:
yield n
n += 1
然后我可以12379
在达到递归深度之前进行质数。
如果我正确理解代码,您需要递归以继续仅将主要候选数字(通过筛法)输入到sieve
函数中。
有没有办法实现这种“惰性计算”算法来进行惰性计算而不使用递归,从而无限地计算素数而不会遇到递归限制障碍?