【发布时间】:2016-06-19 07:19:45
【问题描述】:
我正在尝试使用回溯解决问题,我需要数字的排列。我有这个基本算法,但问题是......结果不是按正常顺序出现的。
def perm(a,k=0):
if(k==len(a)):
print(a)
else:
for i in range(k,len(a)):
a[k],a[i] = a[i],a[k]
perm(a, k+1)
a[k],a[i] = a[i],a[k]
示例:对于 [1,2,3],正常结果是:[1,2,3] [1,3,2] [2,1,3] [2,3,1] [3, 1,2] [3,2,1]
而该算法将交换最后两个元素。我明白为什么。我只是不知道如何纠正这个问题。
我不想使用来自 itertools 的排列。上面的代码可以很容易地修复以正常工作吗?从上面看这个算法的复杂度是多少?
【问题讨论】:
-
这里有一些非递归代码,它使用古老的 Narayana Pandita 算法按字典顺序生成排列(假设初始列表排序正确):stackoverflow.com/a/31678111/4014959
-
您可能还会发现stackoverflow.com/a/28525468/4014959 感兴趣:它可以从索引号产生任何排列。
标签: python algorithm recursion permutation backtracking