所以我试图生成小于2000000的素数并找到它们的总和..对于样本大小我尝试质数为40000,但得到了分段错误。我尝试了很多值,我发现数字35044是该程序的崩溃点。
import sys
sys.setrecursionlimit(100000000)
def stuff(total, rnge):
for n in rnge:
ubound=int(n**0.5)+1
print ubound
for x in range(3, ubound, 2):
if n % x == 0:
stuff(total, range(n+2, 35044, 2))
#print n
total = total + n
#print total
print total
exit()
stuff(17, range(11, 35044, 2))
这是导致错误的结果:"Run Command: line 1: 2942 Segmentation fault: 11 python "$1" "${@:3}"
旁注:Finder还说python崩溃并给我一个崩溃报告,包括这两个有趣的信息:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00007fff5f3fffb8
不确定这是否有用。
另外,对于那些想知道的人,我使用最新的15英寸rMPB,配备16 GB RAM和2.7 Ghz处理器,当我运行该程序时,吃了14GB或者一些空闲的内存,然后在打印后崩溃数次181次。
答案 0 :(得分:2)
当你遇到像你发现的堆栈问题时,没有理由使用递归,特别是如果你的目标语言不支持尾调用优化 - 比如Python。
这是一个替代的,非常天真的实现( O(n ^ 2)),但它没有递归就这样做,所以它可以用来求和任意数量的素数,虽然速度很慢候选窗口变得更大。
from math import sqrt
total = 1+2
for i in range(3,2000000):
for j in range (2,int(sqrt(i)+1)):
if i%j==0:break
else:
total+=i
print total
答案 1 :(得分:1)
对您的函数的递归调用是否可能耗尽系统的可用内存?