实现Heap';Python中排列的s算法
我试图用python实现Heap的算法,但在重复一些解决方案时遇到了麻烦。我被臭虫的位置难住了。以下是实施方案:实现Heap';Python中排列的s算法,python,algorithm,permutation,Python,Algorithm,Permutation,我试图用python实现Heap的算法,但在重复一些解决方案时遇到了麻烦。我被臭虫的位置难住了。以下是实施方案: import copy def _permute(l, n): if n == 1: print(l) else: for i in range(n - 1): # note: must copy here, or all answers will be same new_arr = c
import copy
def _permute(l, n):
if n == 1:
print(l)
else:
for i in range(n - 1):
# note: must copy here, or all answers will be same
new_arr = copy.copy(l)
_permute(new_arr, n - 1)
if n % 2 == 0:
l[i], l[n - 1] = l[n - 1], l[i]
else:
l[0], l[n - 1] = l[n - 1], l[0]
_permute(l, n - 1)
对于输入[0,1,2]
和3
,我得到:
[0, 1, 2]
[1, 0, 2]
[2, 1, 0]
[1, 2, 0]
[0, 1, 2] ** repeats from first answer **
[1, 0, 2] ** repeats from second answer **
对于从第一个和第二个重复的最后2个结果,缺少:
[0, 2, 1]
[2, 0, 1]
我已经搜索了多个地方并尝试了该算法的不同实现,但无论我尝试了多少次,我似乎都无法让它工作。我遗漏了什么?您将递归调用放置在错误的位置,这应该可以解决问题(您不应该使用副本):
在您的解决方案中,递归调用的顺序有何不同?关键是不要进行复制。虽然它修改了函数中的“l”参数并正确打印出来,但它不会修改它的原始调用。我的解决方案是创建一个新数组并将l的结果附加到该数组中,但如果我不复制,所有值都将是相同的。关键是将副本从for循环移动到if n==1语句中:`if n==1:new\u arr=copy.copy(l)result.append(new\u arr)`!非常感谢!我正要把电脑扔出窗外。
def _permute(l, n):
if n == 1:
print(l)
else:
_permute(l, n - 1)
for i in range(n - 1):
if n % 2 == 0:
l[i], l[n - 1] = l[n - 1], l[i]
else:
l[0], l[n - 1] = l[n - 1], l[0]
_permute(l, n - 1)