我更新字典的简单递归程序会长时间冻结整个计算机。我编写了一个脚本,以查找所有主要因素及其数量,并将其放入字典中。
例如:如果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)
我的代码有什么问题,我该如何解决?
答案 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
>