1

我正在尝试编写字符串排列问题。而不是字符串,我有一个整数列表,如 [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
4

2 回答 2

1

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

改变:

words.append(nums)

至:

words.append(nums[:])

这将创建一个副本nums并“冻结”它的当前状态。

评论: 您可以以更 Python 的方式进行交换,而不是:

temp = nums[start]
nums[start] = nums[current]
nums[current] = temp

做:

nums[start], nums[current] = nums[current], nums[start]
于 2017-11-10T01:50:08.257 回答
0

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

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

一种解决方案是复制当前排列:

words.append(nums[:])

顺便说一句,pythonic 交换是:

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

此外,无需重置current.

于 2017-11-10T01:58:22.053 回答