Python递归函数如何为tri_递归函数工作?

Python递归函数如何为tri_递归函数工作?,python,recursion,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 Ex

我是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)
以及输出:

Recursion Example Results  
1  
3  
6  
10  
15  
21  

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

考虑到这一部分

if(k>0):
    result = k+tri_recursion(k-1)
...
从这里开始

tri_recursion(6) = 6 + tri_recursion(5)
因此,为了得到
tri\u递归(6)
的结果,我们必须得到
tri\u递归(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)
现在请注意,0不大于0,因此程序将移动到else子句的主体:

else:
    result = 0
...
这意味着
tri\u递归(0)=0
。因此:

tri_recursion(6) 
= 6 + 5 + 4 + 3 + 2 + 1 + tri_recursion(0)
= 6 + 5 + 4 + 3 + 2 + 1 + 0
= 21
注意事项
  • 在运行此程序时,
    k
    永远不等于
    -1
    ,实际上这是不可能的
  • 将控制流看作“编译器在程序中移动”是一种误导。编译器在执行期间不做任何事情(这是另一回事)。最好从过程语言中的控制流/执行顺序、函数编程中的等式和逻辑编程中的关系来考虑

  • 如果您像这样调试代码

    def tri_recursion(k):
        if(k > 0):
            print('\t'*k,'start loop k',k)
            holder = tri_recursion(k - 1)
            result = k + holder
            print('\t'*k,'i am k(', k,')+previous result(', holder,')=',result)
        else:
            result = 0
            print('i reached when k =', k)
        print('\t'*k,'end loop', k)
        return result
    
    print("\n\nRecursion Example Results")
    tri_recursion(6)
    
    您将看到如下输出

    Recursion Example Results
                             start loop k 6
                         start loop k 5
                     start loop k 4
                 start loop k 3
             start loop k 2
         start loop k 1
    i reached when k = 0
     end loop 0
         i am k( 1 )+previous result( 0 )= 1
         end loop 1
             i am k( 2 )+previous result( 1 )= 3
             end loop 2
                 i am k( 3 )+previous result( 3 )= 6
                 end loop 3
                     i am k( 4 )+previous result( 6 )= 10
                     end loop 4
                         i am k( 5 )+previous result( 10 )= 15
                         end loop 5
                             i am k( 6 )+previous result( 15 )= 21
                             end loop 6
    21
    

    使用此可视化工具。它将帮助你如何使用堆栈概念进行递归。为了更好地理解,请看这个链接,我认为这是一个很好的可视化过程。