【问题标题】:Dynamic Nesting of For loops in python [duplicate]python中For循环的动态嵌套[重复]
【发布时间】:2019-11-13 20:37:42
【问题描述】:

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

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”的值就可以得到结果而不用编辑代码?

【问题讨论】:

  • c 在你的脚本中做了什么?
  • c 决定嵌套循环的数量

标签: python for-loop recursion nested-loops generic-programming


【解决方案1】:

你不需要递归,只需要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)

【讨论】:

    【解决方案2】:

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

    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]
    

    【讨论】:

    • 这种方法比使用itertools.product()函数要快。
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多