编写一个递归函数adelements,返回列表中所有元素的和。例如,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'
得到这个错误,任何帮助都会很好,谢谢:)
问题就在这几行。
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
这与递归无关。s
的第一个元素显然是一个整数,你试图将一个列表添加到int,如错误所述。
也许你的意思是:
def addElements(s):
if not s: return 0
return s[0] + addElements(s[1:])
您应该看到函数的不同退出点,并查看您返回的值的类型。
如果您看到以下代码:
def addElements(s):
return 0 if s == [] else s[0] + addElements(s[1:])
您可以看到两个替代方法是0或s[0](它应该在您的平面列表中产生一个整数)+ adelements (s[1:])(它应该产生对自身的另一个调用(将切割条件作为整数作为返回值),或一个整数)。
我还建议您使用sum(s)
而不是您的自定义函数,因为sum()是本机和编译的,并且会更快。