使用列表在python中进行递归时出错

时间:2014-03-26 15:41:31

标签: python list recursion integer

编写一个递归函数addElements,它返回列表中元素的总和。 例如,addElements([2,1,3])给出6。

def addElements(s):
    if s == []:
        return 0
    else:
        s[0] + addElements(s[1:])
        return s

错误:

TypeError: unsupported operand type(s) for +: 'int' and 'list'

收到此错误, 任何帮助都会很好,谢谢:)

3 个答案:

答案 0 :(得分:3)

问题出在这些方面。

s[0] + addElements(s[1:])
return s

您正在查找两个元素的总和,忽略它们并返回列表。当您只是返回s时,之前的addElements(s[1:])来电将获得s[1:],您将尝试

s[0] + s[1:]

其中s[0]将是列表中的第一个元素,而s[1:]将是列表的其余部分。这就是你得到这个错误的原因。

你应该做的是

return s[0] + addElements(s[1:])

所以,你的递归会变成这样的

addElements([2, 1, 3])
       ||
2 + (addElements([1, 3]))
       ||
2 + (1 + (addElements([3])))
       ||
2 + (1 + (3 + (addElements([]))))
       ||
2 + (1 + (3 + (0)))
       ||
2 + (1 + (3))
       ||
2 + (4)
       ||
6 # Your answer

答案 1 :(得分:1)

这与递归无关。 s的第一个元素显然是一个整数,你试图在错误陈述的情况下向int添加一个列表。

也许你的意思是:

def addElements(s):
    if not s: return 0
    return s[0] + addElements(s[1:])

答案 2 :(得分:0)

您应该看到函数的不同出口点,并查看返回值的类型。

如果您看到此替代代码:

def addElements(s):
    return 0 if s == [] else s[0] + addElements(s[1:])

你可以看到两个替代方案是0或s [0](它应该在你的平面列表中产生一个整数)+ addElements(s [1:])(它应该产生另一个自己的调用(具有切割条件为整数作为返回值)或整数)。

另外我建议您使用sum(s)而不是自定义函数,因为sum()是本机的并且已编译,并且会更快。