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