更新字典的简单递归程序会冻结计算机

时间:2019-07-16 19:11:05

标签: python python-3.x dictionary recursion freeze

我更新字典的简单递归程序会长时间冻结整个计算机。我编写了一个脚本,以查找所有主要因素及其数量,并将其放入字典中。

例如:如果N = p n x q m

然后字典应为:{ 1:1 , p:n , q:m }

我的代码适用于少量数字,但适用于大量数字,例如54365765878,它会使计算机长时间冻结,任务管理器显示我的脚本使用2 Gb中的1.4 Gb RAM。

这是我的代码:

M=int(input('Enter M\n'))

M_fac={1:1}

def fac_rec(m):
    global M_fac
    for d in [k for k in range(2,int(m//2)+1)]+[int(m)]:
        if m%d==0 and d!=1:
            if d in M_fac:
                M_fac[d]+=1
            else:
                M_fac[d]=1
            fac_rec(m/d)
            break

fac_rec(M)

print(M_fac)

我的代码有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:0)

这是对递归的可怕使用!

现在那已经不合时宜了,我相信您的代码存在的问题是这一行:

for d in [k for k in range(2,int(m//2)+1)]+[int(m)]:

我们不是简单地遍历这个(可能很大)的数字范围,而是创建必须存储在内存中的实际列表。 (反复递归。)我知道,如果m是质数,则必须使用附加项。但是让我们重新设计代码,以避免创建此列表(以及其他调整):

from collections import defaultdict

M = int(input('Enter M: '))

M_fac = defaultdict(int, {1: 1})

def fac_rec(m):
    global M_fac

    for d in range(2, m // 2 + 1):
        if m % d == 0:
            M_fac[d] += 1

            fac_rec(m // d)
            return

    M_fac[m] += 1  # m is prime!

fac_rec(M)

print(dict(M_fac))

输出

> python3 test.py
Enter M: 54365765878
{1: 1, 2: 1, 29: 1, 89: 1, 163: 1, 64613: 1}
>

验证

> dc
1 2 * 29 * 89 * 163 * 64613 * p
54365765878
>