首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >遇到Prime Indicator Python代码的递归错误,可以重写以避免错误吗?

遇到Prime Indicator Python代码的递归错误,可以重写以避免错误吗?
EN

Stack Overflow用户
提问于 2020-12-22 11:23:49
回答 1查看 27关注 0票数 0

我已经编辑了一段代码,它给出了大规模质数的反馈。如果数字是素数,它将产生一个以零结尾的两位数,并且它将显示两个相同的数字。对于复合数字,它将显示两个不以零结尾的数字。对于复合输入范围(2^8-2,2^8)--output__54 54,或者对于主输入范围(2^7-2,2^7)--输出为__30 30,您可以以这种方式输入数字

然而,我得到了一个递归错误。有没有办法重写代码,这样它就不会使用递归,或者有没有办法绕过递归。我尝试增加sys开销,但不起作用。

当我尝试11的时候,我注意到了递归错误。

这是代码,如果有人可以帮我编码,这样就不会出现递归了?

代码语言:javascript
运行
复制
 def isPrime(n):

     isPrime = True

     def is_divisible(n,divisor):
         if n<(divisor-1)*divisor: return False
         if n%divisor==0: return True
         else:
             divisor += 1
             return is_divisible(n,divisor)

     if n==2:
         isPrime = True
     elif is_divisible(n,divisor=2):
         isPrime = False
     return isPrime

 def getNumPrimes(n):
     if n <= 2:
         return 0
     else:
         return isPrime(n-1) + getNumPrimes(n-1)
    
 for n in range(2**11-2,2**11):
     print(getNumPrimes(n))     
EN

回答 1

Stack Overflow用户

发布于 2020-12-22 11:49:08

你可以使用你的算法的迭代变体。与对is_divisible()getNumPrimes()使用递归不同,您可以从底部开始,然后按照自己的方式工作。

有一堆不同的方法可以计算小于或等于给定数目的质数,这个post基准测试了其中几个用python编写的。以下是最快的一个的粘贴:

代码语言:javascript
运行
复制
def prime_count(n):
    """Counts number of prime numbers from 0 to n (inclusive)."""
    count = 0
    sieve = [True] * (n + 1)
    for p in range(2, n):
        if sieve[p]:
            count += 1
            for i in range(p, n + 1, p):
                sieve[i] = False
    return count

或者,如果您不想编辑代码,可以使用sys模块增加python中的递归限制(尽管可能会有一些意想不到的后果,因此请谨慎操作):

代码语言:javascript
运行
复制
import sys
sys.getrecursionlimit()
>>> 3000

getNumPrimes(6000)
>>> RecursionError: maximum recursion depth exceeded in comparison

sys.setrecursionlimit(10000)
getNumPrimes(6000)
>>> 783
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65402847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档