n = int(input("What number do you want factored out"))
def factors(n):
for i in range(2,n):
if n % i == 0:
return i
n = n/i
return factors(n)
print(factors(n))
我当前正在使用当前代码,但是我只能得到第一个因素。我可以不使用递归来重复代码并生成所有因素吗? 有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
改为使用while
循环:
def factors(n):
f = []
while n != 1:
for i in range(2, n + 1):
if n % i == 0:
f.append(i)
n //= i
break
return f
print(factors(150))
或者,具有递归:
def factors(n):
if n == 1:
return []
for i in range(2, n + 1):
if n % i == 0:
return [i] + factors(n // i)
print(factors(150))
两个输出:
[2, 3, 5, 5]
答案 1 :(得分:0)
return
关键字实质上终止了函数的执行。紧接return
语句之后的任何语句都不会到达。因此,只要找到一个因素并执行return i
,您的函数就会结束。也许您会混淆return i
和print i
?另外,也可以将其添加到数组中,然后再传递给下一个递归函数调用。
答案 2 :(得分:0)
这可以递归完成,但是最好迭代地执行此算法,因为它更快,更易读:
def factors(n):
for i in range(1, int(n ** 0.5) + 1):
if n % i == 0:
yield i
yield n // i
print(list(factors(25)))
这远没有工业实力,但应该相当快。它允许重复,因此您可能希望在set()
之前调用list()
。您只需要迭代到n
的平方根,并且对于任何作为因数的数字i
,请包含可以乘以i
的数字即可得到n
也是
答案 3 :(得分:0)
如果您需要所有因素,则可以执行以下操作:
import numpy as np
fact = lambda x : np.arange(1,x+1)[x % np.arange(1,x+1)==0]
fact(100)
array([ 1, 2, 4, 5, 10, 20, 25, 50, 100])
fact(27)
array([ 1, 3, 9, 27])
如果您只想要素数乘数:
def facts(x,m=None,i=2):
if m is None:
m = []
if x //i >0:
if x % i ==0:
m.append(i)
facts(x // i,m ,i)
else:
facts(x,m,i+1)
return(m)
facts(150)
[2, 3, 5, 5]
facts(2*3*5*7*9*10)
[2, 2, 3, 3, 3, 5, 5, 7]