【问题标题】:Implementing Heap's Algorithm for Permutations in Python在 Python 中实现堆的置换算法
【发布时间】:2020-07-13 11:56:21
【问题描述】:

我正在尝试在 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 = 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]

我搜索了多个地方并尝试了该算法的不同实现,但无论我尝试多少次,我似乎都无法让它发挥作用。我错过了什么?

【问题讨论】:

    标签: python algorithm permutation heaps-algorithm


    【解决方案1】:

    您将递归调用放在错误的位置,这应该可以解决问题(并且您不应该使用副本):

    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)
    

    【讨论】:

    • 递归调用的顺序在您的解决方案中有何不同?关键是不要复制。
    • 虽然它修改了函数中的“l”参数并且可以正确打印出来,但它不会修改它的原始调用。我的解决方案是创建一个新数组并将 l 的结果附加到它,但如果我不复制所有值将是相同的。关键是将 for 循环中的副本移动到 if n == 1 语句中: ` if n == 1: new_arr = copy.copy(l) result.append(new_arr) ` 这行得通!非常感谢!我正要把电脑扔出窗外。
    猜你喜欢
    • 2015-03-17
    • 2015-10-24
    • 2011-05-03
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 2019-07-31
    相关资源
    最近更新 更多