我想要枚举k部分中n的所有分区。
因此,对于p(5,3),我得到2个k = 3 =>的分区。 (3,1,1),(2,2,1)。
这是我在搜索和查看stackoverflow时发现的内容:
def p(n,k):
lst = []
if n < k:
return lst
elif k == 1:
return lst
elif k == n:
return lst
else:
p(n-1, k-1)
p(n-k, k)
return lst
^^^^这是我想要的形式,
实际上,找到k个部分的总和很容易,你返回p(n-1,k-1)+ p(n-k,k)。至于我,我需要列出每个元素,如[(3,1,1),(2,2,1)]。
我的主要问题是&#34; build&#34;那些分区是递归的。你会如何解决这个问题?
修改
如果你得到基本情况k = 1,加上+ 1,k-1次。 (4,1)然后(4,1,1)
如果您获得基本情况k = n,则拆分并删除每个部分。
像这样:(3,3)然后是(3,3,3)然后是(2,2,2)
如果你得到基本情况k&lt;没什么
基本上,我的问题是&#34; stack&#34;从基础案例到最高者获得完整列表p(6,3)= [(2,2,2),(4,1,1),(3,2,1)]
答案 0 :(得分:2)
我会在递归函数中添加第三个参数m
,它是元素在分区中可以拥有的最大值。然后我会定义这样的函数:
def p(n, k, m=None):
if m is None:
m = n - k + 1 # maximum can be n - k + 1 since minimum is 1
if k == 0:
if n == 0:
yield ()
return
for i in xrange(1, m + 1): # first could be from 1 to the maximum
# the rest of the sum will be n - i among k - 1 elements with
# maximum i
for t in p(n - i, k - 1, i):
yield (i, ) + t
示例:
>>> list(p(10, 3))
[(4, 3, 3), (4, 4, 2), (5, 3, 2), (5, 4, 1), (6, 2, 2), (6, 3, 1), (7, 2, 1), (8 , 1, 1)]
>>> list(p(6, 2))
[(3, 3), (4, 2), (5, 1)]