所以我需要一个算法来生成除循环旋转之外的数字列表的所有排列(例如[1,2,3] == [2,3,1] == [3,1,2]).
如果序列中至少有一个唯一编号,则相当简单,取出该唯一编号,生成剩余编号的所有排列(但对"标准"排列算法进行少量修改)并将唯一编号添加到前方.
为了生成排列,我发现有必要将排列代码更改为:
def permutations(done, options)
permuts = []
seen = []
for each o in options
if o not in seen
seen.add(o)
permuts += permutations(done+o, options.remove(o))
return permuts
Run Code Online (Sandbox Code Playgroud)
仅在选项中使用每个唯一编号一次意味着您不会获得322两次.
当没有唯一元素时,该算法仍然输出旋转,例如对于[1,1,2,2]它将输出[1,1,2,2],[1,2,2,1]和[1,2] ,1,2]和前两个是循环旋转.
那么是否有一种有效的算法可以让我生成所有的排列而不必事后去除循环旋转?
如果不是,那么删除循环旋转的最有效方法是什么?
注意:这不是使用Python,而是使用C++.