首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >给定整数n,则返回给定长度M的所有组合m,其中m_1+m_2+m_3+.....m_m =n

给定整数n,则返回给定长度M的所有组合m,其中m_1+m_2+m_3+.....m_m =n
EN

Stack Overflow用户
提问于 2022-07-03 11:00:34
回答 1查看 42关注 0票数 0

我试图解决一个老问题,但我找不到一个算法(我觉得它是递归的)或理想的迭代工具解决方案。

给定整数n,则返回给定长度M的所有组合m,其中m_1+m_2+m_3+.....m_m =n

例如:如果n=2καιM=3,我需要得到列表m: 2,0,0,0,0,0,2,1,1,1,1,0,1,1,1,但对于任意n和M。

EN

回答 1

Stack Overflow用户

发布于 2022-07-26 22:09:53

您是对的,这是一个递归的解决方案。实际上,假设我们希望f(n,M)返回一个与n相加的M元素的元组列表。应该不难说服自己,对于任何非负的k<=nf(n-k,M-1)中的每个元组都可以通过简单地添加一个k项从f(n,M)转换为元组(反之亦然,如果去掉这个术语,f(n,M)中的每个元组都会从f(n-k,M-1)中产生一个元组)。考虑到这一点:

代码语言:javascript
复制
def f(n,M):
    if M==1:
        return [(n,)]
    sequences = []
    for k in range(n+1):
        for sequence in f(n-k,M-1):
            sequences.append((k,)+sequence)
    return sequences

注意这里的基本情况--如果是M==1,则只有一个可能的序列。您还可能想要处理M==0,如果n==0[]不是这样的话,它应该返回n==0

最好是作为生成器这样做,因为您可以动态地生成这些序列:

代码语言:javascript
复制
def f(n,M):
    if M==1:
        yield [(n,)]
    else:
        for k in range(n+1):
            yield from map(lambda sequence: (k,)+sequence, f(n-k, M-1))

我不相信迭代工具可以以任何明显的方式帮助实现这一点-- combinations当然可以帮助生成所有可能的M-tuples,因此我们以后只能将那些加在一起的东西保持为n,但是很快就会变得非常慢。直接生成有效的元组需要在创建这些元组时对所发生的“算术”有一定的了解,据我所知,这不是迭代工具所要做的事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72845924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档