Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么递归函数返回这个值?_Python_Python 3.x - Fatal编程技术网

Python 为什么递归函数返回这个值?

Python 为什么递归函数返回这个值?,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

我试图理解为什么递归函数返回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 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是什么意思。我明白了,看起来我不完全理解递归。现在有道理了。