我正在为任何数字的因子创建一个模块。在其中,我还有两个函数(一个导致调用另一个函数)找到数字的素数因子,n。
出现的问题是递归错误(如果我的递归定义是正确的)。 当我为一个数字调用函数时,它会打印所有素数因子,然后它会添加最后两个素数因子并再次打印它,并重复执行,显然没有结束。
到目前为止我的代码:
def primeFactors(n):
from primenum2 import isPrime
from math import sqrt
global pFact, y
x, pFact, y = 2, [], 0
if isPrime(n):
return n
else:
while x <= sqrt(n):
if isPrime(x) and (n%x==0):
pFact.append(x)
y = n / x
if isPrime(y):
pFact.append(y)
print pFact
break
else:
primeFactors2(y)
else:
x += 1
#NEW FUNCTION - I made two functions to avoid another recursion error that was occuring.
def primeFactors2(y):
from primenum2 import isPrime
from math import sqrt
z = 2
while z <= sqrt(y):
if isPrime(z) and (y%z==0):
pFact.append(z)
y = y / z
if isPrime(y):
pFact.append(y)
print pFact
break
else:
primeFactors2(y)
else:
z += 1
当我输入(在Shell中)时:primeFactors(600851475143)
&lt; ---这是Project Euler最初的
预期输出(我已经解决了问题):[71, 839, 1471, 6857L]
实际输出:
[71, 839, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L, 1471, 6857L]
[71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L, 1471, 6857L, 71, 839, 1471, 6857L]
它一遍又一遍地执行此操作,将1471和6857L附加到列表中,然后再次打印它。然后,它再次添加所有素数因子,然后再次打印。不知道为什么会这样做。任何输入都非常感谢。另外,如果有任何方法可以使这段代码更快/更Pythonic,请告诉我:)谢谢
答案 0 :(得分:2)
你做的太多了。您不需要isPrime或递归函数。这是基于试验分割的最简单可能的整数因子函数的伪代码:
define factors(n)
f := 2
while f * f <= n
if n % f == 0
output f
n := n / f
else
f := f + 1
output n
虽然这对于Project Euler#3来说已经足够了,但有更好的方法来计算整数。当你准备好了,我谦虚地推荐{@ 3}}在我的博客上,其中包括这个因子分解算法,以及其他一些,用五种语言实现,包括Python。