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