无法跟踪为什么字符串排列未附加到数组排列的全局变量中

时间:2017-11-10 01:39:50

标签: python string algorithm backtracking recursive-backtracking

我正在尝试编码String置换问题。而不是字符串我有一个整数列表,如[1,2,3]。我必须打印出列表中所有可能的排列。但是,我的代码存在一些问题,我无法弄清楚。不知何故,基本案例中的行if not in words只会遇到一次。我试图在过去一小时内解决这个问题。任何帮助,将不胜感激!。 TIA 这是代码

words = list()  
def permute(nums):
    if len(nums) == 0:
        return None

    l = 0
    r = len(nums)

    permute_helper(nums,0,r)

def permute_helper(nums,start,end):
    current = 0
    if start == end-1:
        if not nums in words:
            print 'appended'
            words.append(nums)   
    else:
        for current in range(start,end):
            temp = nums[start]
            nums[start] = nums[current]
            nums[current] = temp
            #Recursive call
            permute_helper(nums,start+1,end)
            temp = nums[start]
            nums[start] = nums[current]
            nums[current] = temp

permute([1,2,3])
print words

2 个答案:

答案 0 :(得分:1)

该错误是您不断修改相同的列表words.append(nums) ,因此您最终只得到一个已修改但未记录修改的副本。

变化:

words.append(nums[:])

为:

nums

将创建temp = nums[start] nums[start] = nums[current] nums[current] = temp 的副本并“冻结”当前状态。

<强>注释: 你可以用更加pythonic的方式进行交换,而不是:

nums[start], nums[current] = nums[current], nums[start]

做的:

new

答案 1 :(得分:0)

您每次都会附加相同的列表。难怪它已经存在(in words)。

换句话说,您没有收集每个不同的排列,而是收集nums。因此,后续的排列反映在words中。这是可变性的瘟疫。

一种解决方案是制作当前排列的副本:

words.append(nums[:])

顺便说一句,pythonic交换是:

a, b = b, a   # no need for tmp

此外,无需重置current