python3.x中的Def

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(

我正在努力理解以下代码中的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(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)