任意の数の因数のモジュールを作成しています。その中には、数 n の素因数分解を見つける 2 つの関数 (一方は他方の呼び出しにつながる) もあります。
発生する問題は、再帰エラーです (再帰の定義が正しい場合)。数値の関数を呼び出すと、すべての素因数が出力され、最後の 2 つの素因数が追加されて再度出力され、これが繰り返し実行されますが、明らかに終わりがありません。
これまでの私のコード:
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
(シェルで)入力すると:primeFactors(600851475143)
<---これはもともと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にする方法があれば教えてください:)ありがとう