更新:见下文线条 除非我遗漏了什么?你知道吗
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)
无效?你知道吗
您正在原地修改
ar
,因此最终result
包含同一对象的多个副本。将string_permute
中的result.append(ar)
更改为result.append(ar[:])
解决了问题。你知道吗您没有为数组对象创建副本。因此,每次尝试修改数组时,每次函数调用都会发生变化。你知道吗
每次执行递归调用时,为array对象创建一个副本。你知道吗
相关问题 更多 >
编程相关推荐