python - 遇到 Prime Indicator Python 代码的递归错误,是否可以重写以避免错误?
问题描述
我编辑了一段代码,它为大规模的素数提供反馈。如果数字是素数,它将产生一个以零结尾的两位数,并且将显示两个相同的数字。对于复合数字,它将显示两个不以零结尾的数字。对于复合输入范围 (2^8-2, 2^8)--output__54 54 或素数输入范围 (2^7-2, 2^7)--输出为 __30,您将以这种方式输入数字30
但是我遇到了递归错误。有没有办法重写代码,使其不使用递归或者是否有解决递归的方法。我试过增加系统开销,但没有奏效。
我在尝试 11 时注意到递归错误。
这是代码,如果有人可以帮我编写代码,这样递归就不会出现?
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))
解决方案
您可以使用算法的迭代变体。您可以从底部开始并向上工作,is_divisible()
而不是对两者都使用递归。getNumPrimes()
有很多不同的方法可以计算小于或等于给定数字的素数,这篇文章对其中一些用 python 编写的方法进行了基准测试。这是最快的粘贴:
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 中的递归限制(尽管可能会产生一些意想不到的后果,因此请谨慎操作):
import sys
sys.getrecursionlimit()
>>> 3000
getNumPrimes(6000)
>>> RecursionError: maximum recursion depth exceeded in comparison
sys.setrecursionlimit(10000)
getNumPrimes(6000)
>>> 783
推荐阅读
- sql - 如何通过 select 语句中的 id 从另一个表中选择?
- java - SpringBoot oracle.jdbc.OracleDatabaseException:ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER
- python - 如果用户不输入任何内容,则尝试使函数循环并中断
- lua - 卢阿!没想到
- javascript - 尝试在 .Net Core Razor 页面中使用 babel 生成的代码
- visual-studio - 在自定义 MSBuild 任务中更改参考没有预期效果
- git - 推送文件以获取超出文件大小的文件,但在清理文件并减小文件大小之后
- c# - 如何在 wpf c# 中导入和实现新字体
- javascript - 具有 MIME 类型 application/json 的跨域读取阻塞 (CORB)
- javascript - Mongodb查找以获取单个元素而不是对象