2

Project EulerのWebサイトで問題を解決して、Pythonを学ぼうとしています。私は自分のコードに何をさせたいかを正確に知っており、私のメソッドは紙の上で機能しますが、コードを機能させることはできません。

GitHubリンク:https ://github.com/albyr/euler-python/blob/master/euler3.py

私は2つの関数を作成しました。1つは目標数の因数を計算し、もう1つは与えられた数が素数であるかどうかをチェックします。

# Function that finds all the factors of a given number
def findfactors(n):
    # for i in range(1,int(sqrt(n)+1)):
    for i in range(1,n+1):
        if n/i == int(n/i):
            factors.append(i)

# Function that checks if a number is prime
def checkprime(n):
    # Trial division
    for i in range(2,int(sqrt(n)+1)):
        if n/i == int(n/i):
            # Number gives a remainder upon division and therefore is not prime
            isprime = False
            break
        else:
            isprime = True
    if isprime == True:
        return True
    elif isprime == False:
        return False

専門家にとって、そのコードはひどいものに見えると確信しています。しかし、Pythonシェルを使用すると機能します。

>>> checkprime(9)
False
>>> checkprime(79)
True
>>> checkprime(factors[3])
True

しかし、F5でプログラムを実行すると、次のようになります。

Traceback (most recent call last):
  File "/home/alby/euler-python/euler3.py", line 45, in <module>
    checkprime(factors[i])
  File "/home/alby/euler-python/euler3.py", line 32, in checkprime
    if isprime == True:
UnboundLocalError: local variable 'isprime' referenced before assignment

プログラム内からハードコードされた番号(例)を使用してcheckprime関数を呼び出すと、 checkprime(77)出力がまったく得られません。これはPythonの動作の基本的なことであり、私には理解できませんが、私は一生の間、何を理解することができません。

助言がありますか?

4

2 に答える 2

5

checkprime(1)Githubコードでは、 (最後のループの最初の反復で)呼び出しようとしていることがわかります。

# Check each factor to see if it is prime or compound
for i in range(0,len(factors)):
    print (factors[i])
    # Why can't I call checkprime here, like this? It works in the console.
    checkprime(factors[i])

しかし、あなたのコードを見てください:

def checkprime(n):
    # Trial division
    for i in range(2,int(sqrt(n)+1)):
        if n/i == int(n/i):
            # Number gives a remainder upon division and therefore is not prime
            isprime = False
            break
        else:
            isprime = True

の場合n = 1、これrange(2, int(sqrt(1)+1))range(2,2)空です...isprimeループ本体が実行されることはないため、設定されることはありません。

の引数range()半開区間であることに注意してください- range(x,y)「xで始まりyの前で終わる整数」です。したがってrange(2,3) = [2]range(2,2) = []

ここでのもう1つの問題は、最初の要因としてfindfactors()戻ってくることです。これはおそらくあなたが望むものではありません。1

def findfactors(n):
    # for i in range(1,int(sqrt(n)+1)):
    for i in range(1,n+1):

素因数分解のチェックでは、おそらくで2はなく、から始めたいと思うでしょう1(すべてが1で割り切れるからです)。


また、このコードは冗長です。

if isprime == True:
        return True
    elif isprime == False:
        return False

あなたは本当にこれを次のように書くことができます...

return isprime

isprimeまたは、一歩進んで、そもそも使用しないでください。とでisprime = True置き換えるreturn Trueだけです。isprime = Falsereturn False

最後に、略記int(n/i)n // i-Pythonの//演算子は整数除算を行います。

于 2012-07-13T18:22:18.710 に答える
0

出力印刷がないという点ではprint(checkprime(77))、F5から実行するときに代わりに使用するだけで、出力が得られるはずです。呼び出しから実行する場合、Pythonはデフォルトで何も出力しません(または少なくとも最後のコマンドのみを出力します)。

于 2012-07-13T18:21:54.953 に答える