通过枚举第三个整数=总数(第二个整数=总数,第三个整数=总数,依此类推)。注意total=3是可能的最小总和,因为每个元素都是正的,所以我们从t=3开始。在
在每个总计中,此代码按字典顺序生成它们。在def posint():
t = 3
while True:
for i in range(1, t-1):
for j in range(1, t-i):
yield i, j, t-i-j
t += 1
for i, j, k in posint():
print(i, j, k)
如果您想要一个更通用的版本来接受描述元组长度的参数n,那么可以使用"Stars and Bars"枚举和为t的元组。这给了您非负元组,但您可以向每个值添加一个,以获得唯一的正元组。在
^{pr2}$
一种更易于理解的通用方法根据组合的最大值,并按该值出现在其中的第一列来枚举组合。在这个方案中,最大值t且t出现在第i列的结果在i左侧的列中具有小于t的任意值,并且在i右侧的列中具有小于或等于t的任意值
这种方法相对容易理解,但结果的顺序有点奇怪。在import itertools
def posint(n):
for t in itertools.count(1):
for i in range(n):
for c1 in itertools.product(range(1, t), repeat=i):
for c2 in itertools.product(range(1, t+1), repeat=n-i-1):
yield c1 + (t,) + c2
for c in posint(3):
print(c)