动态嵌套循环-递归

时间:2020-01-01 06:02:23

标签: python for-loop nested

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

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位数字并删除不必要的数字

谢谢

4 个答案:

答案 0 :(得分:4)

您需要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)]

答案 1 :(得分:1)

这是一个递归解决方案,

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

答案 2 :(得分:0)

在这里,您必须传递数字列表以及深度,以便您可以在每个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))                                                                      

答案 3 :(得分:0)

事实是,递归很少是解决问题的最有效方法,而迭代几乎总是更有效。这是因为在递归期间,调用栈的使用量很大,因此与递归调用相关的开销通常更大。

创建一个生成器函数以执行所需的操作。检查下面的代码。

ascend=(i for i in range(100,1000) if i%10 >= (i//10)%10 >= (i//100)%10)
print(list(ascend))

输出

[111, 112, 113, 114, 115, 116, 117, 118, 119, 122, 123, 124, 125, 126, 127, 128, 129, 133, 134, 135, 136, 137, 138, 139, 144, 145, 146, 147, 148, 149, 155, 156, 157, 158, 159, 166, 167, 168, 169, 177, 178, 179, 188, 189, 199, 222, 223, 224, 225, 226, 227, 228, 229, 233, 234, 235, 236, 237, 238, 239, 244, 245, 246, 247, 248, 249, 255, 256, 257, 258, 259, 266, 267, 268, 269, 277, 278, 279, 288, 289, 299, 333, 334, 335, 336, 337, 338, 339, 344, 345, 346, 347, 348, 349, 355, 356, 357, 358, 359, 366, 367, 368, 369, 377, 378, 379, 388, 389, 399, 444, 445, 446, 447, 448, 449, 455, 456, 457, 458, 459, 466, 467, 468, 469, 477, 478, 479, 488, 489, 499, 555, 556, 557, 558, 559, 566, 567, 568, 569, 577, 578, 579, 588, 589, 599, 666, 667, 668, 669, 677, 678, 679, 688, 689, 699, 777, 778, 779, 788, 789, 799, 888, 889, 899, 999]

如果要将输出作为列表列表,请检查以下代码。

ascend=([(i//100)%10,(i//10)%10,i%10] for i in range(100,1000) if i%10 >= (i//10)%10 >= (i//100)%10)
print(list(ascend))

输出

[[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]]