【问题标题】:Dynamic nested loop - recursion [closed]动态嵌套循环 - 递归
【发布时间】:2020-01-01 06:02:23
【问题描述】:

我想生成一个数字按升序排列的数字列表。

for x in range(1,10):
    for y in range(x,10):
        for z in range(y,10):
            print(x,y,z)

我是否可以将其转换为递归,以便我可以改变嵌套深度?

注意事项:

在我的应用程序中,除了打印之外,我还希望将打印语句的负担降到最低。

我知道 itertools.product它不适合 用于我的目的,因为我必须稍后删除不必要的组合。

由于同样的原因,生成所有n 数字并删除不必要的数字也不起作用

谢谢

【问题讨论】:

  • 你想要一个数字列表吗?
  • 不是真的,现在我有一个使用以下列表理解生成的元组列表,但任何格式都可以。我基本上是在寻找算法。
  • test = [(x,y,z) for x in range(1,10) for y in range(x,10) for z in range(y,10) if sum((x ,y,z))==10]
  • 是什么让您认为递归更好?将问题描述为最终目标而不是一种解决方案
  • 那么您评论中的列表理解有什么问题?

标签: python for-loop nested


【解决方案1】:

你需要itertools.combinations_with_replacement()

>>> import itertools
>>> list(itertools.combinations_with_replacement(range(1, 10), 2))
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 6), (6, 7), (6, 8), (6, 9), (7, 7), (7, 8), (7, 9), (8, 8), (8, 9), (9, 9)]

>>> list(itertools.combinations_with_replacement(range(1, 10), 3))
[(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 1, 5), (1, 1, 6), (1, 1, 7), (1, 1, 8), (1, 1, 9), (1, 2, 2), (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 2, 6), (1, 2, 7), (1, 2, 8), (1, 2, 9), (1, 3, 3), (1, 3, 4), (1, 3, 5), (1, 3, 6), (1, 3, 7), (1, 3, 8), (1, 3, 9), (1, 4, 4), (1, 4, 5), (1, 4, 6), (1, 4, 7), (1, 4, 8), (1, 4, 9), (1, 5, 5), (1, 5, 6), (1, 5, 7), (1, 5, 8), (1, 5, 9), (1, 6, 6), (1, 6, 7), (1, 6, 8), (1, 6, 9), (1, 7, 7), (1, 7, 8), (1, 7, 9), (1, 8, 8), (1, 8, 9), (1, 9, 9), (2, 2, 2), (2, 2, 3), (2, 2, 4), (2, 2, 5), (2, 2, 6), (2, 2, 7), (2, 2, 8), (2, 2, 9), (2, 3, 3), (2, 3, 4), (2, 3, 5), (2, 3, 6), (2, 3, 7), (2, 3, 8), (2, 3, 9), (2, 4, 4), (2, 4, 5), (2, 4, 6), (2, 4, 7), (2, 4, 8), (2, 4, 9), (2, 5, 5), (2, 5, 6), (2, 5, 7), (2, 5, 8), (2, 5, 9), (2, 6, 6), (2, 6, 7), (2, 6, 8), (2, 6, 9), (2, 7, 7), (2, 7, 8), (2, 7, 9), (2, 8, 8), (2, 8, 9), (2, 9, 9), (3, 3, 3), (3, 3, 4), (3, 3, 5), (3, 3, 6), (3, 3, 7), (3, 3, 8), (3, 3, 9), (3, 4, 4), (3, 4, 5), (3, 4, 6), (3, 4, 7), (3, 4, 8), (3, 4, 9), (3, 5, 5), (3, 5, 6), (3, 5, 7), (3, 5, 8), (3, 5, 9), (3, 6, 6), (3, 6, 7), (3, 6, 8), (3, 6, 9), (3, 7, 7), (3, 7, 8), (3, 7, 9), (3, 8, 8), (3, 8, 9), (3, 9, 9), (4, 4, 4), (4, 4, 5), (4, 4, 6), (4, 4, 7), (4, 4, 8), (4, 4, 9), (4, 5, 5), (4, 5, 6), (4, 5, 7), (4, 5, 8), (4, 5, 9), (4, 6, 6), (4, 6, 7), (4, 6, 8), (4, 6, 9), (4, 7, 7), (4, 7, 8), (4, 7, 9), (4, 8, 8), (4, 8, 9), (4, 9, 9), (5, 5, 5), (5, 5, 6), (5, 5, 7), (5, 5, 8), (5, 5, 9), (5, 6, 6), (5, 6, 7), (5, 6, 8), (5, 6, 9), (5, 7, 7), (5, 7, 8), (5, 7, 9), (5, 8, 8), (5, 8, 9), (5, 9, 9), (6, 6, 6), (6, 6, 7), (6, 6, 8), (6, 6, 9), (6, 7, 7), (6, 7, 8), (6, 7, 9), (6, 8, 8), (6, 8, 9), (6, 9, 9), (7, 7, 7), (7, 7, 8), (7, 7, 9), (7, 8, 8), (7, 8, 9), (7, 9, 9), (8, 8, 8), (8, 8, 9), (8, 9, 9), (9, 9, 9)]

【讨论】:

  • 这也是一个很好的解决方案。我最终使用了这个。非常感谢
【解决方案2】:

在这里,您必须传递数字列表和深度,以便您可以不断增加每个recursion 的列表。

def get_nums(depth=0,pre_list=[[1]]):
    if depth==0:
        return pre_list
    new_list=[]
    for num in pre_list:
        n=num[-1]
        for i in range(n,10):
            new_list.append(num+[i])
    return get_nums(depth-1,new_list)

print(get_nums(3))                                                                      

【讨论】:

  • 非常感谢 Ateryagaurav 看到这个和你的贡献。
  • 所以你想要的是数字列表而不是数字?你说格式无关紧要,反正我已经编辑了这个以输出列表。
【解决方案3】:

这是一个递归解决方案,

def rec(s,idx,num):
    if idx>=len(s)-1:
        print(s)
        return
    for i in range(num,10):
        s[idx+1] = i # change next number
        rec(s,idx+1,i) # recurse

s = [1,1,1]
idx = -1
num = s[0]
rec(s,idx,num)

输出

[1, 1, 1]
[1, 1, 2]
[1, 1, 3]
[1, 1, 4]
[1, 1, 5]
[1, 1, 6]
[1, 1, 7]
[1, 1, 8]
[1, 1, 9]
[1, 2, 2]
[1, 2, 3]
[1, 2, 4]
[1, 2, 5]
[1, 2, 6]
[1, 2, 7]
[1, 2, 8]
[1, 2, 9]
[1, 3, 3]
...and so on until [9,9,9]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2020-08-19
    相关资源
    最近更新 更多