关于递归示例的问题,我理解代码,程序运行正常,但它不像我期望的那样运行



感谢您的光临。所以我一直在学习 w3schools.com 递归,一切都有意义,直到我看了他们给出的例子:

def tri_recursion(k):
if(k > 0):
result = k + tri_recursion(k - 1)
print(result)
else:
result = 0
return result
print("nnRecursion Example Results")
tri_recursion(6)

我了解代码中的所有内容,但以下: 为什么结果是这样的:

Recursion Example Results
1
3
6
10
15
21

从某种意义上说,为什么数字从小到大列出?

呜呜...其实,你知道吗?在写这篇文章的时候,我想我现在明白了... 就像 6+(5+(4+(3+(2+(1+(0((( 这就是为什么它首先从"最深"的递归中键入小的...... 有趣。 但现在另一个问题出现了:

else
result = 0
return result

所以本质上:

return 0

右? 那为什么程序不打印0None? 感谢您对此进行调查。

由于您自己已经回答了第一个问题(顺便说一下,为了将来可能遇到类似问题的其他人的利益,在这里发布您自己的问题的答案作为答案是完全可以的(,以下是您第二个问题的答案:

return声明不在if-else条款之内。因此,无论上述条件如何,它都会返回当前结果。

为了更好地了解其工作原理,请尝试遵循函数的两个不同调用的执行流程:

tri_recursion(0)调用带有
  1. k=0的函数。这意味着if条件为 false,因此跳过以下缩进代码块(此处为两行(,而是执行 else 语句。因此,值 0 分配给result。没有打印任何内容,因为此处没有print语句。然后该函数返回result,此处为 0。

  2. tri_recursion(1)调用带有
  3. k=1函数。这意味着if条件为 true,因此将执行以下缩进代码块。所以result得到值1 + tri_recursion(0),其中包括将我们带到上面第 1 点的函数调用。在 1 以下的所有内容之后。发生后,函数返回 0,因此result现在1 + 0= 1。我们转到下一行,它打印result,所以它打印 1。跳过else子句,因为上面已经发现条件为真。该函数返回result,它仍然是 1。

通常,当您难以理解执行流程时,尤其是对于本例中的递归函数,在函数的开头和结尾(而不是中间的某个位置(进行print()调用通常更有帮助。特别是对于递归函数或其他嵌套函数调用,我们可能会巧妙地添加一些空格字符来突出显示层次结构,并更容易看到哪个返回值属于哪个函数调用:

def tri_recursion(k):
print('    ' * (6 - k) + 'calling tri_recursion() with k =', k)  
if(k > 0):
result = k + tri_recursion(k - 1)
else:
result = 0
print('    ' * (6 - k) + 'returning', result)
return result
print('Recursion Example Resultsn')
tri_recursion(6)
Recursion Example Results
calling tri_recursion() with k = 6
calling tri_recursion() with k = 5
calling tri_recursion() with k = 4
calling tri_recursion() with k = 3
calling tri_recursion() with k = 2
calling tri_recursion() with k = 1
calling tri_recursion() with k = 0
returning 0
returning 1
returning 3
returning 6
returning 10
returning 15
returning 21
21

最新更新