Python 递归函数如何与 tri_recursion 函数一起工作?

Bal*_*aji 6 python recursion

我是 Python 新手,我发现下面的递归程序很难遵循。在调试程序时,我发现它会经历递归,并且k每次递归时值都会递减-1。在某个时刻k为 -1,编译器移动到该else部分并返回 0。

最后k结果是1,这是怎么回事呢?

def tri_recursion(k):
  if(k>0):
    result = k+tri_recursion(k-1)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)
Run Code Online (Sandbox Code Playgroud)

和输出:

Recursion Example Results  
1  
3  
6  
10  
15  
21  
Run Code Online (Sandbox Code Playgroud)

Xer*_*ith 6

尝试用铅笔和纸描出该函数。在这种情况下,函数中的 print 语句可能会有点误导。

考虑程序的这一部分,

if(k>0):
    result = k+tri_recursion(k-1)
...
Run Code Online (Sandbox Code Playgroud)

从这里,

tri_recursion(6) = 6 + tri_recursion(5)
Run Code Online (Sandbox Code Playgroud)

因此,要得到结果,tri_recursion(6)我们必须得到结果tri_recursion(5)遵循这个逻辑,问题就简化为:

tri_recursion(6) 
 = 6 + tri_recursion(5) 
 = 6 + 5 + tri_recursion(4)
 = 6 + 5 + 4 + tri_recursion(3)
 = 6 + 5 + 4 + 3 + tri_recursion(2)
 = 6 + 5 + 4 + 3 + 2 + tri_recursion(1)
 = 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
Run Code Online (Sandbox Code Playgroud)

现在请注意,0 不大于 0,因此程序移至 else 子句的主体:

else:
    result = 0
...
Run Code Online (Sandbox Code Playgroud)

意思是tri_recursion(0) = 0。所以:

tri_recursion(6) 
= 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
= 6 + 5 + 4 + 3 + 2 + 1 + 0
= 21
Run Code Online (Sandbox Code Playgroud)

注意事项

  1. 在运行这个程序时。k永远不等于-1,事实上这是不可能的。
  2. 从“编译器在程序中移动”的角度来思考控制流是一种误导。编译器在执行期间不执行任何操作(JIT是另一回事)。最好从过程语言中的控制流/执行顺序、函数式编程中的方程和逻辑编程中的关系的角度来思考。