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:]) |
有两件事让我有点烦
想象一下它叫…
1 | listSum([3, 5, 3, 7]) |
它可以归结为…
1 | return ls[0] + listSum(ls[1:]) |
…评估为…
1 | return 3 + listSum([5, 3, 7]) |
然后,
然后,
然后,
所以,完整的东西被评估为…
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 下面的另一个代码中)并引发异常;处理空列表会使返回0 的listSum([]) 对yo来说更容易使用。UR应用程序,但另一方面,让listSum([]) 引发异常可能会发现列表意外为空的错误-您可以决定哪一个对您更有用;很高兴,如果您确实处理了空列表案例,len(ls) == 1 案例,那么"只适用于"相同的递归逻辑