我目前正在从事一项学校作业,以使用递归生成前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。如果一切都为True,则打印质数并使用下一个可能的质数递归,将除数重置为2,然后向计数器加1。
我这样调用函数:
checkPrime(2, 2, 0)
两个是起始除数和可能的质数,0是迭代。
我想做的是能够摆脱递归之一。我不想被告知需要使用的确切行代码。如果您只是指出正确的方向,我将不胜感激。谢谢。
答案 0 :(得分:1)
如果您被允许使用any
和all
,那么关键的测试就是看您是否有候选数的有效除数:
limit = ceil(sqrt(cand+1))
if not any([cand % divisor == 0 for divisor in range(2, limit)]):
# This is a prime
你能从那里拿走吗?