我有一个任务来生成数字的素因数
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。
答案 0 :(得分:1)
在循环中递归调用函数时:
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
的行(没有后处理和仅打印语句很难实现),但与您的要求非常接近。
在旁边:
lambda
和filter
如何处理经典问题的演示)