python 中 For 循环的动态嵌套

Dynamic Nesting of For loops in python

我有一小段代码打印出所有可能的方式将 'b' 球填充到 'c' 杯子中考虑到我们也可以选择球的一个子集(就像根本没有球一样):

b = 2
c = 3
for i in range(b+1):
    for k in range(b+1):
        for j in range(b+1):
            if i+j+k<=b:
                print(i,k,j)

结果是:

0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 2 0
1 0 0
1 0 1
1 1 0
2 0 0

现在,问题是这不是通用代码,并且根据杯子 (c) 的数量,需要更改嵌套 For 循环的数量。我尝试使用递归但无法获得所需的结果。

任何人都可以帮助我使这段代码通用,这样我只需要输入 'b' 和 'c' 的值就可以得到结果而无需编辑代码吗?

你不需要递归,只需要 itertools.product:

for t in product(range(b+1), repeat=c):
    if sum(t) <= b:
        print(t)

但是,递归会通过动态调整每个范围以考虑先前的选择来减少您需要考虑的元组数量。

# Untested
def foo(b, c, stop=0):
    for x in range(0, b+1-stop):
        for y in foo(b, c-1, stop + x):
            yield (x, *y)

for t in foo(b, c):
    if sum(t) <= b:
        print(t)

这是一个使用递归生成器的解决方案

def fill(b, c):
    if c == 0:
        yield []
    else:
        for i in range(b+1):
            for sub in fill(b-i, c-1):
                yield [i, *sub]



for o in fill(2, 3):
    print(o)

输出

[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 1, 0]
[0, 1, 1]
[0, 2, 0]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[2, 0, 0]