我试图理解为什么递归函数返回1003而不是1005。
l = [1,2,3]
def sum(l):
x, *y = l
return x + sum(y) if y else 1000
sum(l)
根据pythontutor,y
列表的最后一个值是5,这将使返回值1000 + sum([2,3])
1005,我是否正确?
答案 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