Python初学者,奇怪的输出问题

时间:2010-04-06 05:12:36

标签: python

我对以下代码有一个奇怪的问题。

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点之间的距离,但我不明白为什么它会出现在最终输出中。

3 个答案:

答案 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: