-1

だから私は 2000000 未満の素数を生成し、それらの合計を見つけようとしています。多くの値を試しましたが、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 がクラッシュしたと言い、次の 2 つの興味深い情報を含むクラッシュ レポートを提供します:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00007fff5f3fffb8

これが役立つかどうかはわかりません。

また、疑問に思っている人のために、私は 16 GB RAM と 2.7 Ghz プロセッサを搭載した最新の 15 インチ rMPB を使用しています。プログラムを実行すると、eat が 14 GB のすべてまたは空き 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 に答える