使用堆栈列表的排列

时间:2016-09-30 23:27:36

标签: python algorithm

我试图找到一种方法来枚举数字列表的所有组合,而无需递归或使用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])

2 个答案:

答案 0 :(得分:3)

提出一种算法并不是那么直观,就像那样#34;在不使用递归的情况下生成所有排列。

但是存在几种不同的算法。例如,请查看Heap's algorithm

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

答案 1 :(得分: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]]