【发布时间】:2022-01-23 17:29:04
【问题描述】:
我怎样才能找到长度小于或等于L 的n 中的所有partitions?
【问题讨论】:
标签: python python-3.x combinatorics
我怎样才能找到长度小于或等于L 的n 中的所有partitions?
【问题讨论】:
标签: python python-3.x combinatorics
根据给定的代码here,我们可以包含一个额外的参数L(默认为n)。
我们可能会天真地将if len((i,) + p) <= L: 包含在yield (i,) + p 之前。但是,由于len((i,) + p) = 1 + len(p),任何大于L-1 的n-i 分区都将被丢弃。因此,寻找它们是浪费时间。相反,我们应该在查找n-1 的分区时包含L=L-1 作为参数。然后我们需要通过不运行主体来正确处理L=0 的情况:
def partitions(n, L=None, I=1):
if L is None:
L = n
if L:
yield (n,)
for i in range(I, n//2 + 1):
for p in partitions(n-i, L-1, i):
yield (i,) + p
现在如果L=1,for i 循环将被执行,但for p 循环将不会执行,因为partitions 调用不会产生任何结果;在这种情况下我们根本不需要执行for i循环,这样可以节省很多时间:
def partitions(n, L=None, I=1):
if L is None:
L = n
if L == 1:
yield (n,)
elif L > 1:
yield (n,)
for i in range(I, n//2 + 1):
for p in partitions(n-i, L-1, i):
yield (i,) + p
【讨论】: