0

大きな素数を取得するためにプログラムを作り直しました。すべての出力が印刷された後、最後に多数の赤いフレーズが表示されることを除いて、今では正常に動作します。誰かが理由を教えてください。

出力の最後は次のとおりです。

(100000939.0, 'is prime')
(100000963.0, 'is prime')
(100000969.0, 'is prime')

エラーは

Traceback (most recent call last):
  File "C:/Users/Marcela/Documents/Prime numbers to 100", line 48, in <module>
    loopfunction()
  File "C:/Users/Marcela/Documents/Prime numbers to 100", line 35, in loopfunction
    loopfunction()
  File "C:/Users/Marcela/Documents/Prime numbers to 100", line 35, in loopfunction
    loopfunction()
  File "C:/Users/Marcela/Documents/Prime numbers to 100", line 35, in loopfunction
    loopfunction()
...(many lines of it, the int ends with:) 
File "C:/Users/Marcela/Documents/Prime numbers to 100", line 13, in loopfunction
    while index <= 200000000.0:
RuntimeError: maximum recursion depth exceeded in cmp

スクリプトは次のとおりです。

from __future__ import division
import sys
index=100000000.0
checker=2.0



def loopfunction():
    global index
    global checker
    checker=2

    while index <= 200000000.0:

        if index>=200000001:
            sys.exit(1)
        while checker<=14473.0:

            div = index/checker
            roundiv=round(index/checker, 0)
            if index == 1:
                print (index, "is prime")
                checker=2
                index=index+1
                loopfunction()   
            if checker == index:
                print (index, "is prime")
                checker=2
                index=index+1
                loopfunction()
            if roundiv==div:

                checker=2
                index=index+1
                loopfunction()    

            if checker==14473.0:

                print (index, "is prime")
                checker=2
                index=index+1
                loopfunction()

            checker = checker +1



loopfunction()                 
4

1 に答える 1

2

再帰しないだけで、再帰制限の問題を修正できます。コードには、必要なループがすでに含まれています。

loopfunction()さまざまなifステートメントのの呼び出しをに変更するだけbreakです。

コードを機能させるために必要なのはそれだけですが、ifステートメントのいくつかは不要であることに気づきました(ループ条件で冗長であるか、単にヒットすることが不可能です)。whileまた、ループの方が理にかなっているループを使用していますfor _ in range()。これは、コードの大幅に簡略化されたバージョンであり、目的を明確にするためにいくつかの名前が変更されています。

from math import sqrt

def primeFinder(start, end):
    prime = True

    for index in range(start, end):
        for checker in range(2, int(sqrt(index))+1):
            if index % checker == 0:
                prime = False
                break

        if prime:
            print("%d is prime" % index)

        prime = True

primetest(100000000, 200000001)

このバージョンはまだ非常に長い時間(おそらく数時間)かかります。本当に1億の値の素数をテストしたい場合は、エラトステネスのふるいなど、より優れたアルゴリズムを調査する必要があります。

于 2012-06-17T00:54:34.243 に答える