为什么递归函数会返回此值?

时间:2014-01-21 10:15:21

标签: python python-3.x

我试图理解为什么递归函数返回1003而不是1005。

l = [1,2,3]
def sum(l):
    x, *y = l
    return x + sum(y) if y else 1000

sum(l)

根据pythontutory列表的最后一个值是5,这将使返回值1000 + sum([2,3]) 1005,我是否正确?

enter image description here

4 个答案:

答案 0 :(得分:3)

  

根据pythontutor,y列表的最后一个值是5,这将使返回值1000 + sum([2,3]) 1005,我是否正确?

不,y的最后一个值是[]。它绝不仅仅是一个列表,而且,它永远不会有5。最重要的是,递归返回值始终位于+的右侧,只有x位于左侧。

让我们一步一步:

sum([1, 2, 3]) = 1 + sum([2, 3])
sum([2, 3]) = 2 + sum([3])
sum([3]) = 1000

所以,代替回来:

sum([2, 3]) = 2 + 1000 = 1002
sum([1, 2, 3] = 1 + 1002 = 1003

问题是当y为空时,您将返回1000,而不是x + 1000

你的困惑可能只是一个优先事项。也许你期待这个:

return x + sum(y) if y else 1000

......意思是:

return x + (sum(y) if y else 1000)

......但实际上,这意味着:

return (x + sum(y)) if y else 1000

答案 1 :(得分:2)

逐步递归

1)x = 1 y = [2,3]

2)x = 2 y = [3]

3)x = 3 y = []

请注意,步骤3)从1000开始返回not y。这是因为你的return语句相当于

(x + sum(y)) if y else 1000

因此我们有

3)1000

2)1000 + 2

1)1002 + 1

结果为1003

所以也许您正在寻找的是:

return x + sum(y) if y else 1000 + x

或(从ndpu的答案中复制):

return x + (sum(y) if y else 1000)

(在最后一步考虑x

答案 2 :(得分:2)

您应该添加括号:

l = [1,2,3]
def sum(l):
    x, *y = l
    return x + (sum(y) if y else 1000)

答案 3 :(得分:1)

您应该尝试使用调试器或实际打印函数内部的东西。如果不执行代码,我猜它应该是这样的:

l = [1,2,3]
def sum(l):
    x, *y = l
    return x + sum(y) if y else 1000

sum(l)

它会调用这样的:

-> sum([1,2,3])
x : 1
y : [2, 3]
-> sum([2, 3])
x: 2
y: [3]
-> sum([3])
x: 3
y: []
returns 1000
returns 2 + 1000
returns 1 + 1002