python3.x中的Def
我正在努力理解以下代码中的python函数:python3.x中的Def,python,python-3.x,recursion,Python,Python 3.x,Recursion,我正在努力理解以下代码中的python函数: def sample(k): if(k>0): result = k+sample(k-1) print(result) else: result = 0 return result sample(6) 输出: 我不相信我理解这个函数是如何工作的。我预计输出为11(=6+55)。有人能解释一下这个函数是如何工作的吗 编辑:我的意思是11(=6+5)而不是11(=6+55)关注这一点 def sample(
def sample(k):
if(k>0):
result = k+sample(k-1)
print(result)
else:
result = 0
return result
sample(6)
输出:
我不相信我理解这个函数是如何工作的。我预计输出为11(=6+55)。有人能解释一下这个函数是如何工作的吗
编辑:我的意思是11(=6+5)而不是11(=6+55)关注这一点
def sample(k):
if(k>0):
result = k+sample(k-1)
甚至可以重新写一遍,让它更清晰
def sample(k):
if(k>0):
_next = sample(k-1)
print("{}+{}".format(k, _next))
请注意,k
永远不能为负
您将看到一个模式,最终结果是21
,而不是11
,也不确定55
来自何处
1+0
2+1
3+3
4+6
5+10
6+15
发生的是递归,函数从6…0
开始倒计时,返回调用执行点,然后在k==0
时加回1+k
,然后在k==1
时加回2+(1+0)
,依此类推。。。计算结果就像你在数学课上学到的运算顺序一样
这将继续是
3+(2+(1+0))
,4+(3+(2+(1+0))
,直到回到k==6
,初始输入是递归的,这意味着函数调用自身并不断调用自身,直到出现某种情况。在您的例子中,它一直使用k
的较低值调用自己,直到它达到0,即返回0
由于每次递归调用函数本身后都会打印结果,因此它将按相反顺序打印所有结果。考虑到:调用<代码> k=6 < /代码>将首先调用它“代码> k=5 < /COD>,它将首先调用它与代码> k=4 < /代码>等,并且只有当它首先返回<代码> 0 < /代码>之后,在调用“代码< k=1 < /代码>之后,然后得到<代码> k=2 < /代码>等的结果。
这解释了它打印的内容,它实际上是1
,因为你不打印0
,然后3
,因为那是1+2
,然后6
,因为那是3+3
,然后6+4
,10+5
,最后是15+6
如果您只想让它打印最终结果,则只需打印第一次调用返回的结果:
print(sample(6))
并删除函数中的print语句。让我们看看这里发生了什么
def sample(k): #1
if(k>0): #2
result = k+sample(k-1) #3
print(result) #4
else: #5
result = 0 #6
return result #7
sample(6)
我输入了行号,使其易于处理。当您调用
sample(6)
时,它将看到6>0
,因此它将调用第3行中的sample(5)
。它将执行此操作,直到到达示例(0)
。对于示例(0),它将返回0,并且不打印任何内容。然后对于示例(1)
,它将打印1并返回1。然后对于示例(2)
,它将返回1+2
并打印3。类似地,对于sample(3)
返回6,对于sample(4)
返回10,对于sample(5)
返回15,最后,对于sample(6)
返回21。此函数基本上只是将0和给定的数字之间的所有数字相加。这里你给了它6,所以它将返回1+2+3+4+5+6=21
每个print语句将打印其当前总计。由于涉及递归,该算法无法在不计算样本(5)的情况下计算出6+样本(5),也无法在不找到样本(4)的情况下计算出5+样本(4),以此类推。这将一直持续,直到到达始终返回0的样本(0)。然后它可以找到样本(1)和样本(2)等等,直到样本(6)的最终结果。您的函数处于递归问题下。实际上,它的返回顺序是从1到6。你说的
11(=6+55)
是什么意思?另外,除非你打印(示例(6))结果21是6+5+4+3+2+1,否则你将丢失最终输出。请解释你的期望值?@cricket_007我怀疑6+55
是6+5
@U9 Forward的一个打字错误。为什么你删掉了OP的期望值??不要这样做。请注意,这将正确地打印21,因为您期望的结果将只覆盖最后两个调用,就好像没有发生到0的整个链-这不是此函数所做的。
def sample(k): #1
if(k>0): #2
result = k+sample(k-1) #3
print(result) #4
else: #5
result = 0 #6
return result #7
sample(6)