【问题标题】:Find all partitions of n of length less-than-or-equal to L查找长度小于或等于 L 的 n 的所有分区
【发布时间】:2022-01-23 17:29:04
【问题描述】:

我怎样才能找到长度小于或等于Ln 中的所有partitions

【问题讨论】:

    标签: python python-3.x combinatorics


    【解决方案1】:

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

    我们可能会天真地将if len((i,) + p) <= L: 包含在yield (i,) + p 之前。但是,由于len((i,) + p) = 1 + len(p),任何大于L-1n-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=1for 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2017-03-16
      • 2014-07-19
      • 2019-08-22
      • 1970-01-01
      相关资源
      最近更新 更多