关于python:为什么这种递归方式和它意味着什么?

Why this way for the recursion and what does it mean?

本问题已经有最佳答案,请猛点这里访问。

我在试着理解这段代码

1
2
3
4
5
def listSum(ls):
    if not ls:
        return 0

    return ls[0] + listSum(ls[1:])

有两件事让我有点烦

  • if not ls:—什么意思?由于没有具体说明,它在寻找什么?
  • ls[0] + listSum(ls[1:])—我试过只使用listSum(ls[0:]),但出现了运行错误。为什么?我为什么要坚持使用ls[0] + listSum(ls[1:])

  • 想象一下它叫…

    1
    listSum([3, 5, 3, 7])

    它可以归结为…

    1
    return ls[0] + listSum(ls[1:])

    …评估为…

    1
    return 3 + listSum([5, 3, 7])

    然后,listSum([5, 3, 7])作为5 + listsum([3, 7])

    然后,listSum([3, 7])作为3 + listsum([7])

    然后,listSum([7])作为7 + listsum([]),这是not ls启动并返回0的地方。

    所以,完整的东西被评估为…

    1
    3 + 5 + 3 + 7 + 0

    笔记:

    • listSum(ls[1:])每次都在缩短列表,减少剩余问题的复杂性,直到listSum的调用接收到一个空列表:if not ls: return 0处理的小问题。

    • 递归解决方案通常由两部分组成:一个用于最简单可能的输入的解决方案(有时是几个非常简单的情况),以及一些说明如何接受任意复杂的输入并将其简化为一个公式,从而进行一个或多个回避调用,每个调用至少要简单一点,总是朝着最简单的输入移动。SIST输入

    • "我尝试过使用listSum(ls[0:])"—ls[0:]返回ls的副本—它会要求对同一个列表进行无限次处理。

    • 可以说,更直观地处理一个元素的列表——if len(ls) == 1: return ls[0],但是如果有人调用listSum([]),你会尝试访问[0](在if下面的另一个代码中)并引发异常;处理空列表会使返回0listSum([])对yo来说更容易使用。UR应用程序,但另一方面,让listSum([])引发异常可能会发现列表意外为空的错误-您可以决定哪一个对您更有用;很高兴,如果您确实处理了空列表案例,len(ls) == 1案例,那么"只适用于"相同的递归逻辑