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

它可以工作,但是每当我再次运行“因子”函数时,它只会附加到已经填充的“因子”列表中——如何在每次运行“因子”函数时清除列表?

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 闭包来做同样的事情。

它长了两行(一行声明一个内部函数,另一行调用它)并且可能对某些人来说“丑陋”,但它的优点是不向调用者不应该看到或使用的原始函数添加参数并且不调用每次递归的条件赋值。

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 回答