【问题标题】:Error doing recursion in python using lists使用列表在python中进行递归时出错
【发布时间】:2014-05-05 03:46:24
【问题描述】:

编写一个递归函数 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'

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

【问题讨论】:

  • 嘿,你可以作弊然后做sum(s)

标签: python list recursion integer


【解决方案1】:

这与递归无关。 s 的第一个元素显然是一个整数,您正在尝试将一个列表添加到一个 int 中,如错误所述。

也许你的意思是:

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

【讨论】:

    【解决方案2】:

    问题出在这几行。

    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
    

    【讨论】:

    • @user3464959 很高兴能帮上忙!如果您觉得它对您有用,请随时 accept my answer。 :-)
    【解决方案3】:

    你应该看到函数的不同退出点,看看你返回的值是什么类型。

    如果您看到此替代代码:

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

    您可以看到两种选择是 0 或 s[0](它应该在您的平面列表中产生一个整数)+ addElements(s[1:])(它应该产生另一个对自身的调用(具有剪切条件整数作为返回值),或整数)。

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

    【讨论】:

      猜你喜欢
      • 2020-02-06
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      相关资源
      最近更新 更多