Python中数字的素数

时间:2018-08-09 20:16:38

标签: python loops recursion

我有一个任务来生成数字的素因数

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。

1 个答案:

答案 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的行(没有后处理和仅打印语句很难实现),但与您的要求非常接近。

在旁边:

  • 不要在每次迭代时生成素数列表。一次生成并在所有通话中使用
  • 使用Sieve of Erathostenes算法,该算法效率更高(您所应用的公式更多地是lambdafilter如何处理经典问题的演示)