Python 不包括重复组合的整数的不同分区

Python 不包括重复组合的整数的不同分区,python,recursion,dynamic-programming,integer-partition,Python,Recursion,Dynamic Programming,Integer Partition,我在网上的某个地方找到了这段代码,我正试图弄清楚它是如何工作的。为partitions()函数提供一个整数,代码返回不包含重复数字的不同分区数(例如,n=5->2个分区(3,2)和(4,1))。我想了解这个递归解决方案是如何管理它的。我一直在玩弄代码,跟踪递归调用,但我仍然不能完全理解它是如何工作的。请帮我理解 def分区(n): 备注=[[0表示范围内(n+2)]表示范围内(n+2)] 返回砖块(1,n,备注)-1 def砖(h、l、备注): 如果备忘录[h][l]!=0: 返回备忘录[h][

我在网上的某个地方找到了这段代码,我正试图弄清楚它是如何工作的。为partitions()函数提供一个整数,代码返回不包含重复数字的不同分区数(例如,n=5->2个分区(3,2)和(4,1))。我想了解这个递归解决方案是如何管理它的。我一直在玩弄代码,跟踪递归调用,但我仍然不能完全理解它是如何工作的。请帮我理解

def分区(n):
备注=[[0表示范围内(n+2)]表示范围内(n+2)]
返回砖块(1,n,备注)-1
def砖(h、l、备注):
如果备忘录[h][l]!=0:
返回备忘录[h][l]
如果l==0:
返回1
如果l
乍一看,它看起来像是沿着“等分分区子集和”的思路进行的记忆

您可能从下面的答案中得到了代码:

您可以在那里或此处找到有关其工作原理的说明:

这里的总体思路是从
n
开始,询问“如何从以各种可能的方式分割的数字子集中计算
n
”?(拆分发生在递归调用
memo[h][l]=(bricks…
)时。每个递归可能会进一步拆分,以尝试形成与上一次拆分剩余的任何差异,等等

注:如果“h”和“l”分别表示为“高”和“低”,则此处的“h”和“l”似乎是向后的。

这似乎是将
n
划分为至少两个不同部分的分区数

memo
忘掉所有的缺点-这只是一个优化,模糊了意图。剩下的变量名很糟糕。我将使用
L
H
(至少
L
不像
L
那样容易与数字1混淆)

砖(高、低)
似乎是L分成不同部分的数量,其中最小部分至少是H。有多少部分?好的,
H
在这样一个分区中,或者不是。如果
H
是,那么
L-H
仍然存在,并且需要分成至少是
H+1
的部分。如果de>H不在这样的分区中,则
L
仍然存在,并且需要将其分区为至少
H+1
的部分。将这些互斥的情况加在一起:

bricks(H, L) = bricks(H+1, L-H) + bricks(H+1, L)
如果
L
,则不存在
L
的分区,其中至少有一部分
H
,因此为0。由于
bricks(L,L)
必须为1(显然有一个
L
的分区,其中至少有一部分
L
),因此需要
bricks(H,0)
返回1以计算上述总和

最后,
n
到至少2个不同部分的分区数是
n
到不同部分的分区数,其中至少1-
块(1,n)
-减去单个分区
{n}
(该分区没有至少2个不同部分)


理解的障碍不是代码本身,而是找出代码背后的想法。

可能值得注意的是,
l==0
基本情况可以用
l==h
进行更直接的测试。它的递归次数少了一点,但得到了相同的结果。对,我不是为了改进代码,但是要完全按照给定的方式重建代码背后的思想,
L==0
案例本身是毫无意义的,而且,我能说的最好的情况是,只能通过我在回答中阐述的推理来证明它是合理的:“否则它将不起作用”;-)检查
L==H
本身是有意义的。