我很难写出排列。一旦找到新算法,我就会陷入可变性。有没有办法追加到newArray中,但保持旧的价值不变?
或者我应该如何修改它?
newArray = []
def permutations(array):
if array in newArray:
return
for i in range(len(array)):
array[0], array[i] = array[i], array[0]
newArray.append(array)
permutations(array)
return newArray
答案 0 :(得分:1)
就像你说的,问题是列表是可变的。因此,解决方案是您必须复制array
而不是改变原始版本。看起来应该是这样的:
(编辑:更改为反映grovina评论浅层副本就足够了)
newArray = []
def permutations(array):
if array in newArray:
return
for i in range(len(array)):
array_copy = list(array) # or array[:] or copy.copy(array); they all create copies
array_copy[0], array_copy[i] = array_copy[i], array_copy[0]
newArray.append(array_copy)
permutations(array_copy)
return newArray
由于您正在修改newArray
(因为它是一个列表而变得可变),因此在函数结束时也没有必要将其返回,但是&#39由你决定。
答案 1 :(得分:0)
感谢您的回复,我最终得到了这个:
def permutations(array):
if len(array) == 0:
return [[]]
if len(array) == 1:
return [array]
else:
arr = []
for i in range(len(array)):
array[0], array[i] = array[i], array[0]
start = array[0]
end = permutations(array[1:])
for x in end:
arr.append([start]+x)
return arr
print(permutations([1, 2]))
输出:[[1,2],[2,1]]
适用于任何输入。