繁体   English   中英

使用堆栈的列表排列

[英]Permutations of a list using stack

我试图找到一种方法来枚举数字列表的所有组合,而无需递归或使用 itertools。 我想出了一个有效的解决方案,但我认为它毕竟变成了一个递归函数。 我是 Python 新手,不确定如何在没有递归的情况下完成这项工作。

感谢任何帮助,因为我认为我仍然没有看到两者之间的区别。

result = []

def permutation(li):
    if len(li) == 1:
        result.append(li[0])
        print (result)
        result.pop()
        return

    for i in range(0,len(li)):
        result.append(li[i])
        permutation(li[:i] + li[i+1:])
        result.pop()    

permutation([1,2,3])

想出一个“就像那样”的算法,在不使用递归的情况下产生所有排列并不是那么直观。

但是存在几种不同的此类算法。 看看堆的算法,例如:

def permutation(li):
    n = len(li)
    c = [0] * n

    print(li)
    i = 1
    while i < n:
        if c[i] < i:
            j = c[i] if i % 2 else 0
            li[j], li[i] = li[i], li[j]
            print(li)
            c[i] += 1
            i = 1
        else:
            c[i] = 0
            i += 1

我一直很喜欢这个方法:

直到队列中每个变体的长度等于输入的长度:将下一个输入元素放在每个变体的所有位置

input [1,2,3]

queue [[1]]
insert 2 in all positions of each variation
queue [[2,1],[1,2]]
insert 3 in all positions of each variation
queue [[3,2,1],[2,3,1],[2,1,3],[3,1,2],[1,3,2],[1,2,3]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM