我有一个任务来产生一些主要因素
I input 396, I expect 2*2*3*3*11 back.
我想出了一个对带有2个参数的函数进行递归的想法:数字和结果作为列表。
我希望步骤是这样的:
(396, [empty])
(198,[2])
(99,[2,2])
(33, [2,2,3])
(11, [2,2,3,3])
(1, [2,2,3,3,11])
我们到达那里,当数字达到1时,表示工作已完成,我们将列表作为结果。
这是我在Python中的代码:
import math
def list_of_prime(x):
filtered_list = list(range(2, x))
for i in range (2, int(round(math.sqrt(x), 0))):
filtered_list = list(filter(lambda x: x == i or x % i, filtered_list))
return filtered_list
def prime_factor(x,y):
if (x-1) != 0:
for i in list_of_prime(x):
if x % i == 0:
y.append(i)
x = x // i
print(x, y)
prime_factor(x, y)
return y
prime_factor(396,[])
结果是
198 [2]
99 [2, 2]
33 [2, 2, 3]
11 [2, 2, 3, 3]
1 [2, 2, 3, 3, 11]
3 [2, 2, 3, 3, 11, 11]
33 [2, 2, 3, 3, 11, 11, 3]
11 [2, 2, 3, 3, 11, 11, 3, 3]
1 [2, 2, 3, 3, 11, 11, 3, 3, 11]
3 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11]
66 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3]
33 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2]
11 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3]
1 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3, 11]
11 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3, 11, 3]
1 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3, 11, 3, 11]
6 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3, 11, 3, 11, 11]
3 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3, 11, 3, 11, 11, 2]
1 [2, 2, 3, 3, 11, 11, 3, 3, 11, 11, 3, 2, 3, 11, 3, 11, 11, 2, 3]
看起来像在工作,但是当x为1时,x仍然以某种方式通过了条件检查,并且迭代器“ i”实际上在第一个if之后从2变为11,
x&i表示1%11不能为0,但是如果随后通过“ y.append(i)”行添加到列表中,则它仍然超过第二个内部;因此,我在列表中看到双“ 11”。我不知道其余结果是如何产生的。
我在启用了Windows的Linux上在Windows上运行了Visual Studio代码,并通过bash在Windows终端上安装了python。
最佳答案
当您在循环中递归调用函数时:
if x % i == 0:
y.append(i)
x = x // i
print(x, y)
prime_factor(x, y)
您没有返回结果。因此,它会不断循环,并在
y.append(i)
后面附加不需要/重复的值,最后返回y
。它是经典Why does my function return None?的变体,除了在这里,该函数不返回
None
是因为它返回y
作为后备。通过做:
return prime_factor(x, y)
我懂了
198 [2]
99 [2, 2]
33 [2, 2, 3]
11 [2, 2, 3, 3]
它缺少
1
的行(没有后处理和仅打印语句很难实现),但它与您的要求非常接近。在旁边:
不要在每次迭代时生成素数列表。一次生成并在所有通话中使用
使用Sieve of Erathostenes算法,该算法效率更高(您所应用的公式更多地是
lambda
和filter
如何处理经典问题的演示)