找到长度小于或等于 L 的 n 的所有分区

Find all partitions of n of length less-than-or-equal to L

如何找到 n 中长度小于或等于 L 的所有 partitions

根据给定的代码 here,我们可以包含一个额外的参数 L(默认为 n)。

我们可能天真地在 yield (i,) + p 之前包含 if len((i,) + p) <= L:。但是,由于 len((i,) + p) = 1 + len(p)n-i 中任何长于 L-1 的分区都将被丢弃。因此,寻找它们会浪费时间。相反,我们应该在查找 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=1for i 循环将被执行,但是 for p 循环中的 none 将被执行,因为 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