Python 3.x 该程序要求输入一个数字,然后打印出其所有因子,150-->;2,3,5,5

Python 3.x 该程序要求输入一个数字,然后打印出其所有因子,150-->;2,3,5,5,python-3.x,Python 3.x,我目前正在使用当前的代码,但是我只能得到第一个因素。我可以不使用递归来重复代码并生成所有因子吗? 有更好的方法解决这个问题吗?使用而不是循环: 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 factor

我目前正在使用当前的代码,但是我只能得到第一个因素。我可以不使用递归来重复代码并生成所有因子吗?
有更好的方法解决这个问题吗?

使用
而不是
循环:

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))
或者,使用递归:

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))

return
关键字实质上终止了函数的执行。任何紧跟在
return
语句之后的语句将永远不会到达。因此,只要您找到一个因子并返回i,您的函数就结束了。也许您混淆了
返回i
打印i
?或者,将其添加到数组中,并通过下一个递归函数调用将其传递下去。

这可以递归完成,但最好是迭代执行此算法,因为它更快、可读性更强:

[2, 3, 5, 5]

这与工业实力相去甚远,但应该相当快。它允许重复,因此您可能希望在
list()
之前调用
set()
。您只需迭代到
n
的平方根,对于作为因子的任何数字
i
,包括可乘以
i
的数字即可得到
n

如果需要所有因子,则可以执行以下操作:

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)))
如果您只需要素数乘数:

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])

这段代码还有一个有趣的副作用,输入一个素数(2除外)将导致一个无限循环。仔细检查你的逻辑,并用一个简单的例子(例如10)手工完成这一过程,看看你的逻辑哪里出了问题。你想要的是素数因子还是所有因子??你也想要负的因子吗?只需要乘以那个数的因子。。。问题措词不当。150/2=75,75/3=25,25/5=5,5/5=1我对为什么范围从1开始到n+1有点困惑。它只是查看每个数字,检查它是否平均分配——如前所述,效率没有考虑在内。如果你愿意,我可以更新一个更有效的答案。不,不。不需要这么客气。我很困惑,因为我不想从2开始,因为不管怎样,1都是一个因素?当然,你可以这样做,但是如果你不手工添加,它将被忽略在结果之外。没问题。我添加了更高效的版本——我讨厌到处推广缓慢的分解函数。如果这里有什么,请告诉我。我知道,但我试图在标题中生成OP的预期输出,而不是因子的数学定义。我可以问一下//=的作用吗?这就是基本除法吗?@Pallof
/
是整数除法,所以
a//b
相当于
int(a/b)
,而
a//=b
相当于
a=a//b
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]