Python 将整数分解为和

Python 将整数分解为和,python,math,Python,Math,前言:我知道做出改变的算法,但不幸的是,这不适用于这里。根据我的理解,变更生成算法的目标是将值分解为最小项数的总和。这不是我的观点,我希望能够将该值分解为任何给定项数的总和 我遇到了一个问题,不知道您是否有任何提示/提示。基本上,我有一个变量(一个int),我想把它分解成给定数量的项的加法。而且,因为它太简单了,这些术语必须从一系列可能的术语中选择。(让我们假设这里至少有一种方法可以做到这一点,验证之前就已经完成了)。请允许我举例说明: var = 12 nbr_terms = 3 possib

前言:我知道做出改变的算法,但不幸的是,这不适用于这里。根据我的理解,变更生成算法的目标是将值分解为最小项数的总和。这不是我的观点,我希望能够将该值分解为任何给定项数的总和

我遇到了一个问题,不知道您是否有任何提示/提示。基本上,我有一个变量(一个int),我想把它分解成给定数量的项的加法。而且,因为它太简单了,这些术语必须从一系列可能的术语中选择。(让我们假设这里至少有一种方法可以做到这一点,验证之前就已经完成了)。请允许我举例说明:

var = 12
nbr_terms = 3
possible_terms = [2, 3, 4, 6]
# Function to create
breaker(var, nbr_terms, possible_terms)
breaker()
函数应返回(其中一个)分解。例如,这里可以是
6+3+3
4+4+4


我有一个我认为可行的想法,只是如果
可能的\u terms
数组有很多元素,它可能会非常消耗资源。它将循环通过这个数组来测试给定数量的术语的每个可能组合,将每个工作组合存储在另一个数组中,并随机选择一个。此外,由于
nbr\u术语
也是一个参数,我不知道如何继续

我想您需要的是来自
itertools
组合与替换。
因此,它将生成所有的
可能的\u术语组合
,而无需替换,并且您可以在每个组合中指定元素的数量(在您的情况下,它是
nbr\u术语)
。 以下代码应起作用:

import itertools as it
def breaker(var, nbr_terms, possible_terms):
    results=[]
    for i in it.combinations_with_replacement(possible_terms, nbr_terms):
       # print (i, sum(i))
        if sum(i)==var:
            results.append(i)
    return results
我用你提供的数字运行了它:

var = 12
nbr_terms = 3
possible_terms = [2, 3, 4, 6]
breaker(var, nbr_terms, possible_terms)
它返回一个包含所有3种可能组合的列表,总计为12:

[(2, 4, 6), (3, 3, 6), (4, 4, 4)]

我找到了一种递归的方法。该函数找到所有可能的组合(
2+4+6
与此函数的
4+2+6
不同),并返回列表,然后我随机选择其中一个

下面是函数:

def broker(var, nbr_terms, possible_terms, list_all, nbr, term, current_list):
    if(term == nbr_terms and nbr == var):
        list_all.append(current_list)
    elif(nbr < var and term < nbr_terms):
        for i in possible_terms:
            broker(var, nbr_terms, possible_terms, list_all, nbr+i, term+1, current_list+[i])
def代理(变量、nbr\U术语、可能的\U术语、列表所有、nbr、术语、当前\U列表):
如果(术语==nbr\U术语和nbr==var):
列表\u全部。追加(当前\u列表)
elif(nbr
请允许我解释这些参数:
var
nbr\u术语
可能的术语
与问题中的相同,
list\u all
是工作组合的列表,
nbr
term
current\u列表
是递归参数


我想就这些了,感谢田林河,他也回应了

谢谢你的回复!这将是完美的工作!只是,这意味着组合已排序(稍后我将不得不随机化,这是完全可行的,但这将是一个额外的步骤)。此外,这是一个库中的函数,所以我会检查它的工作方式,以便完全理解它,但是对于这个项目,如果可能的话,我更喜欢自己做事情。不过,谢谢你的回答,这将有助于我的其他项目!不客气!您完全可以研究[itertools]()文档,在那里您可以找到等价的代码。如果答案是正确的,你能接受它作为答案吗?