我正在尝试编码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
答案 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
。