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