2

私はプログラミングが初めてです。数値のすべての素因数を与えるアルゴリズムをPythonで作成しようとしています:

factors=[]
def factor(n):
    for i in range(2,n+1):
        if n%i==0:
            factors.append(i)
            factor(int(n/i))
            break
    return factors

それは機能しますが、「factor」関数を再度実行するたびに、すでに入力されている「factors」リストに追加されるだけです.関数「factor」が実行されるたびにリストをクリアするにはどうすればよいですか?

4

2 に答える 2

6

関数内でローカル変数を宣言します。あなたのコードでは、実際にfactors呼び出すたびにグローバル変数を変更していますfactor()

def factor(n, factors=None):
    factors = [] if factors is None else factors 
    for i in range(2, n + 1):
        if n%i==0 and i not in factors: #checks for duplicates as well
            factors.append(i)
            factor(int(n / i),factors) #pass the factors list in the recurive call
            break
    return factors

factor(20) #returns [2, 5]
于 2013-05-18T12:55:30.077 に答える
0

@ashwini-chaudhary には素晴らしい答えがあり、これは私がこれに使用する最も一般的なイディオムです。OPは一般化された質問をしていたので、Pythonクロージャーを使用して同じことを行う修正されたソリューションを提供します。

これは 2 行長く (1 つは内部関数を宣言し、もう 1 つはそれを呼び出す)、一部の人にとっては「醜い」かもしれませんが、呼び出し元が表示または使用してはならない元の関数に引数を追加しないという利点があります。各再帰での条件付き代入。

def factor2(n):
    factors = []
    def fact(n):
        for i in range(2, n + 1):
            if n%i==0 and i not in factors: #checks for duplicates as well
                factors.append(i)
                factor(int(n / i),factors) #pass the factors list in the recurive call
                break
    fact(n)
    return factors
于 2013-05-19T14:08:51.897 に答える