gpt4 book ai didi

python - 整数分区的递归公式

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:32 25 4
gpt4 key购买 nike

我编写了以下代码,使用涉及五边形数的递归公式计算整数分区:

def part(n):
p = 0
if n == 0:
p += 1
else:
k = 1
while ((n >= (k*(3*k-1)/2)) or (n >= (k*(3*k+1)/2))):
i = (k * (3*k-1)/2)
j = (k * (3*k+1)/2)
if ((n-i) >= 0):
p -= ((-1)**k) * part(n-i)
if ((n-j) >= 0):
p -= ((-1)**k) * part(n-j)
k += 1
return p

n = int(raw_input("Enter a number: "))
m = part(n)
print m

代码在 n=29 之前工作正常。它在 n=24 附近变得有点慢,但我仍然可以在不错的运行时内获得输出。我知道算法是正确的,因为产生的数字与已知值一致。

对于大于 35 的数字,即使等待很长时间(大约 30 分钟)也没有得到输出。我的印象是 python 可以处理比这里使用的数字大得多的数字。有人可以帮助我改进运行时间并获得更好的结果吗?另外,如果代码有问题,请告诉我。

最佳答案

你可以使用 Memoization :

def memo(f):
mem = {}
def wrap(x):
if x not in mem:
mem[x] = f(x)
return mem[x]
return wrap

@memo
def part(n):
p = 0
if n == 0:
p += 1
else:
k = 1
while (n >= (k * (3 * k - 1) // 2)) or (n >= (k * (3 * k + 1) // 2)):
i = (k * (3 * k - 1) // 2)
j = (k * (3 * k + 1) // 2)
if (n - i) >= 0:
p -= ((-1) ** k) * part(n - i)
if (n - j) >= 0:
p -= ((-1) ** k) * part(n - j)
k += 1
return p

演示:

In [9]: part(10)
Out[9]: 42

In [10]: part(20)
Out[10]: 627

In [11]: part(29)
Out[11]: 4565

In [12]: part(100)
Out[12]: 190569292

通过内存,我们可以记住之前的计算,因此对于重复计算,我们只需在字典中进行查找。

关于python - 整数分区的递归公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com