Python 为什么递归函数返回这个值?
我试图理解为什么递归函数返回1003而不是1005Python 为什么递归函数返回这个值?,python,python-3.x,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) 根据y列表的最后一个值是5,这将使返回值1000+sum[2,3]1005,对吗 逐步递归 1 x=1 y=[2,3] 2 x=2 y=[3] 3 x=3 y=[] 注意,步骤3返回1000,因为不是y。这是因为您的return语句与 (x + sum(y)) if y else
l = [1,2,3]
def sum(l):
x, *y = l
return x + sum(y) if y else 1000
sum(l)
根据y列表的最后一个值是5,这将使返回值1000+sum[2,3]1005,对吗
逐步递归
1 x=1 y=[2,3]
2 x=2 y=[3]
3 x=3 y=[]
注意,步骤3返回1000,因为不是y。这是因为您的return语句与
(x + sum(y)) if y else 1000
因此,我们有
31000
2100+2
1002+1
结果是1003
因此,也许您正在寻找的是:
return x + sum(y) if y else 1000 + x
或抄袭ndpu的答案:
return x + (sum(y) if y else 1000)
在最后一步中考虑x
根据pythontutor的说法,y列表的最后一个值是5,这将使返回值1000+sum[2,3]1005,对吗
否,y的最后一个值为[]。它只不过是一个列表,而且,它永远不会有5s。最重要的是,递归返回值总是在+的右边,只有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
您应该尝试使用调试器或实际打印函数中的内容。如果不执行代码,我想应该是这样的:
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
应添加括号:
l = [1,2,3]
def sum(l):
x, *y = l
return x + (sum(y) if y else 1000)
这个语法是什么:x,*y=l?是Python3吗?@Elisha它会将l的其余部分解压到y。我猜是这样的,但它在python2.7上不起作用。我认为最好加上蟒蛇3tag@Elishax,*y=seq将迭代序列,将第一个元素放在x中,将所有其他元素(即使没有)放在列表中,并将该列表分配给y。如果y只是一个iterable,而解包是懒惰的,那就太酷了,但是这会使处理x,*y,last=sequence之类的事情变得复杂。我只是想评论一下,并说return/if做的事情和你想象的不同:但其他人已经做了。所以,请记住:如果x,那么y是正常的。如果x与语法相反,则为y。行末尾的IF应用于其前面的整行/表达式。因此,作为回报……如果。。return关键字位于if之下,而不是相反。所以,你需要括号来限制它的效果。他已经尝试使用一个交互式的分步可视化工具,但无法理解它向他显示了什么;我不确定pdb风格的调试器是否会有所帮助,它以一种新手不太容易接近的方式提供相同的信息……我不明白的是x最终是如何变成3的。因为在每次迭代中,我们都会将x重新分配给下一个l值。x被提高到3。函数如何记住x值?为什么在第2步和第1步有1000+2和1002+1?我认为我们应该只得到2和1,因为在那个阶段不会触发else条件,因为它是一个递归。步骤2中的值是步骤3中的值,即1000+x等于2。步骤1中的值是步骤2中的值,即1002+x为1。至于第一个问题:在第三步中,你调用sum[3]所以x,*y=[3]产生x=3,y=[]。我不确定你说的提升到3是什么意思。我明白了,看起来我不完全理解递归。现在有道理了。