我目前正在完成一项学校作业,使用递归生成前 25 个素数。当我编写的程序生成质数时,在第 23 个数之后会发生错误。
RecursionError: maximum recursion depth exceeded in comparison
我已经通过在我自己的计算机上扩展递归深度解决了这个问题,但是我意识到并不是每个人都会这样做。我已经决定改为缩短程序中运行的递归数量。我在这方面遇到了麻烦,想寻求帮助。
首先。
def checkPrime(a, n, c):
其中 a 是除数,n 是可能的素数,c 是迭代。
if c <= 24:
if n % a <= 0:
if n == a:
print(n, end = ' ')
return checkPrime(2, n + 1, c + 1)
return checkPrime(2, n + 1, c)
return checkPrime(a + 1, n, c)
它主要检查迭代,n 是否可以被 a 整除,以及 n 是否等于 a。如果 n 不能被 a 整除,它会以加一的形式出现。如果 n 不等于 a,它会重复出现下一个可能的素数并将除数重置为 2。如果一切为真,它会打印素数并重复出现下一个可能的素数,将除数重置为 2,然后将 1 加到计数器.
我这样调用函数:
checkPrime(2, 2, 0)
2 是起始除数和可能的素数,0 是迭代。
我想做的是能够摆脱其中一个递归。我不想被告知我需要使用的确切线路代码。如果您能指出正确的方向,我将不胜感激。谢谢。
最佳答案
如果您被允许any
和all
,那么您的关键测试是查看您是否有任何有效的候选数字除数:
limit = ceil(sqrt(cand+1))
if not any([cand % divisor == 0 for divisor in range(2, limit)]):
# This is a prime
你能从那里拿走它吗?
关于python - 减少一个递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55132437/