我对以下代码有一个奇怪的问题。
from math import sqrt
def Permute(array):
result1 = []
result2 = []
if len(array) <= 1:
return array
for subarray in Permute(array[1:]):
for i in range(len(array)):
temp1 = subarray[:i]+array[0]+subarray[i:]
temp2 = [0]
for num in range(len(array)-1):
temp2[0] += (sqrt(pow((temp1[num+1][1][0]-temp1[num][1][0]),2) + pow((temp1[num+1][1][1]-temp1[num][1][1]),2)))
result1.append(temp1+temp2)
return result1
a = [['A',[50,1]]]
b = [['B',[1,1]]]
c = [['C',[100,1]]]
array = [a,b,c]
result1 = Permute(array)
for i in range(len(result1)):
print (result1[i])
print (len(result1))
它的作用是找到点abc的所有排列,然后将它们与每个有序点之间的距离之和一起返回。这样做;然而,它似乎也报告了一个奇怪的附加值,99。我认为99来自计算a和c点之间的距离,但我不明白为什么它会出现在最终输出中。
答案 0 :(得分:2)
问题是您递归调用Permute(array[1:])
,然后使用递归结果来计算temp1
。为什么这是个问题?您的函数输出一个数组数组,其中最后一个子数组是temp2
,即距离和。因此,每个级别的递归,您将为最终结果添加越来越多的额外距离。
如果你真的想要计算同一函数中的所有排列和距离,那么我建议你返回一个元组(permutation, distance)
。然后,您可以在分配temp1
时使用元组的第一部分,这样您就不会意外添加额外的距离。如果您不熟悉元组,请参阅this page。
答案 1 :(得分:0)
我同意Justin Ardini的说法,但我也建议您学习使用像pdb这样的Python调试器。然后你可以通过这样的功能,找出自己发生的事情。你会从中学到更多东西。
答案 2 :(得分:0)
我认为你要做的是:
from math import sqrt
def Permute(array):
result1 = []
result2 = []
if len(array) <= 1:
for subarray in array:
for i in range(len(array)):
temp1 = subarray[:i]+array[0]+subarray[i:]
temp2 = [0]
for num in range(len(array)-1):
temp2[0] += (sqrt(pow((temp1[num+1][1][0]-temp1[num][1][0]),2) + pow((temp1[num+1][1][1]-temp1[num][1][1]),2)))
result1.append(temp1+temp2)
return result1
a = [['A',[50,1]]]
b = [['B',[1,1]]]
c = [['C',[100,1]]]
array = [a,b,c]
result1 = Permute(array)
for i in range(len(result1)):
print (result1[i])
print (len(result1))
我改变了:
if len(array) <= 1:
return array
for subarray in Permute(array[1:]):
为:
if len(array) <= 1:
for subarray in array: