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



编写一个递归函数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()是本机和编译的,并且会更快。

相关内容

  • 没有找到相关文章

最新更新