函数中的函数,python在列表中递归

函数中的函数,python在列表中递归,python,recursion,Python,Recursion,当我得到最后一个递归步骤时,我得到一个 def minimizeMaximumPair(lst): lst.sort() def compute(aList): if len(aList) != 0: return [(aList[0], lst[len(aList) - 1])].extend(compute(aList[1:len(aList) - 1])) return [] return compute(

当我得到最后一个递归步骤时,我得到一个

def minimizeMaximumPair(lst):
    lst.sort()

    def compute(aList):
        if len(aList) != 0:
            return [(aList[0], lst[len(aList) - 1])].extend(compute(aList[1:len(aList) - 1]))
        return []

    return compute(lst)

我试着什么也不返回,问题是当您调用
.extend()

compute
函数尝试返回
.extend()
的值,即
None
。与
.sort()
类似,
.extend()
修改对象本身,而不是返回对象的修改副本。这就是所谓的可变性。下面是一些工作代码:

TypeError: 'NoneType' object is not iterable

这是因为
extend
是一个不返回任何内容的函数,它只是在适当的位置更改列表。一种可能的解决方案是使用
+

def compute(aList):
    if len(aList) != 0:
        out = [(aList[0], lst[len(aList) - 1])]
        out.extend(compute(aList[1:len(aList) - 1]))
        return out
    return []

您可以使用<代码>列表,而不是返回<代码>无<代码>的
list.extend

\uuuu iadd\uuuu
还扩展了就地列表,但随后返回
列表

如果您不喜欢使用特殊方法,可以从
操作员
模块使用
iadd

return [(aList[0], lst[len(aList) - 1])] + compute(aList[1:len(aList) - 1])

这会导致每次都复制第一个列表,而不仅仅是扩展现有的listTrue,但这也是最干净的解决方案。也许,但这种态度——当一层接一层地放置时——会让我们在大型程序中变得非常缓慢,这是毫无意义的。为什么我们必须调用“特殊”方法?这个问题更多的是对所用方法的行为的误解。@Zizouz212,不是真的。如果您正在编写函数式代码,您需要了解这一点,否则您将复制已经是该语言一部分的代码。我将递归调用更改为Simpler,但使用您的解决方案:iadd([(列表[0],列表[-1])],compute(列表[1:-1])@MaximeRoussin Bélanger,酷,我更新了我的答案。现在-您仍在使用
列表[1:-1]
制作部分副本。如果您需要更高的性能,您应该考虑为第一个和最后一个索引传递额外的参数,而不是实际分割列表。我想我可以后退,因为:.extend()对吗?@MaximeRoussin-Bélanger Yep,您应该能够。
from operator import iadd

...

def compute(aList):
    if len(aList) != 0:
        return iadd([(aList[0], aList[-1])], compute(aList[1: -1]))
    return []