编写一个递归函数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'
收到此错误, 任何帮助都会很好,谢谢:)
答案 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()是本机的并且已编译,并且会更快。