-1

所以我试图生成小于 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 或一些空闲 RAM,然后在打印数字 181 a 后崩溃几次。

4

2 回答 2

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
于 2013-09-10T05:08:29.127 回答
1

对您的函数的递归调用是否有可能耗尽系统的可用内存?

于 2013-09-10T04:46:41.230 回答