2016-09-30 58 views
0

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

似乎是一个功课问题?否则,我不明白为什么你不会使用itertools。 – Lagerbaer

+0

我最初的想法是创建一组生成器(每个生成器都有一个偏移量表示它们何时吐出下一个值),但我不确定这符合问题的精神。这里有一些有趣的想法:http://stackoverflow.com/questions/2710713/algorithm-to-generate-all-possible-permutations-of-a-list –

回答

2

这不是直观拿出一个算法“就是这样”产生的所有排列,而无需使用递归的。

但是存在几种不同的这种算法。有看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 
+0

感谢分享这个。这是我正在尝试,但不能完全达到那里。 –

+0

不客气;-) – trincot

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