更新:请参阅以下行 除非我遗失了什么?
from array import array
def string_permute(ar, lo, hi, result):
if lo == hi:
# print ar # this gives correct permutated output, howcome result isn't able to store that?
result.append(ar)
else:
for index in xrange(lo, hi+1):
ar[index], ar[lo] = ar[lo], ar[index]
string_permute(ar, lo+1, hi, result)
ar[index], ar[lo] = ar[lo], ar[index]
return result
if __name__ == "__main__":
f = array('c', '1234')
result = []
string_permute(f, 0, len(f)-1, result)
print result
输出:
[array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234'), array('c', '1234')]
预期产出:
array('c', '1234') array('c', '1243') array('c', '1324') array('c', '1342') array('c', '1432') array('c', '1423') array('c', '2134') array('c', '2143') array('c', '2314') array('c', '2341') array('c', '2431') array('c', '2413') array('c', '3214') array('c', '3241') array('c', '3124') array('c', '3142') array('c', '3412') array('c', '3421') array('c', '4231') array('c', '4213') array('c', '4321') array('c', '4312') array('c', '4132') array('c', '4123')
我尝试传入result = result or []
,然后进行
result += string_permute(ar, lo+1, hi, result)
return result #at the end of loop
但这也是适得其反的,并且输出相同。我不知道为什么。
这不是因为array
我也只是用一个列表来尝试它。
如下面的其中一个答案中所述,我使用了一个列表。
def string_permute(ar, lo, hi, result):
if lo == hi:
result.append(ar[:]) #why does this work and result.append(ar) doesn't?
print ar
else:
for index in xrange(lo, hi+1):
ar[index], ar[lo] = ar[lo], ar[index]
string_permute(ar, lo+1, hi, result)
ar[index], ar[lo] = ar[lo], ar[index]
return result
if __name__ == "__main__":
f = array('c', '1234').tolist() #just made it into a list
result = []
string_permute(f, 0, len(f)-1, result)
print result
问:为什么这样做而且result.append(ar)
没有?
答案 0 :(得分:3)
您没有为数组对象制作副本。因此,每次尝试修改数组时,它都会针对每个函数调用进行更改。
每次进行递归调用时,请为数组对象创建一个副本。
import copy
string_permute(copy.copy(ar), lo+1, hi, result)
答案 1 :(得分:2)
您正在修改ar
inplace,因此您最终会得到包含同一对象的多个副本的result
。在result.append(ar)
中将result.append(ar[:])
更改为string_permute
可解决问题。