# ### 递归函数 : 自己调用自己的函数 ''' 递:去 归:回 有去有回是递归 ''' # (1) 最简单的递归函数 def digui(n): print(n) if n>0: digui(n-1) print(n) digui(5) ''' 代码解析: 去的过程: n = 5 print(5) 5>0 digui(5-1) => digui(4) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞 print(4) 4>0 digui(4-1) => digui(3) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞 print(3) 3>0 digui(3-1) => digui(2) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞 print(2) 2>0 digui(2-1) => digui(1) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞 print(1) 1>0 digui(1-1) => digui(0) 执行到第12行,自己调用自己,代码暂定在12行,发生阻塞 print(0) 0>0? 条件不满足,代码向下执行, print(0) 如果函数执行到最后一层调用结束,要触底反弹,回到上一层函数调用处 回的过程: print(1) 回到参数为1的第12行 代码继续向下执行, print(1) print(2) 回到参数为2的第12行 代码继续向下执行, print(2) print(3) 回到参数为3的第12行 代码继续向下执行, print(3) print(4) 回到参数为4的第12行 代码继续向下执行, print(4) print(5) 回到参数为5的第12行 代码继续向下执行, print(5) 5 4 3 2 1 0 0 1 2 3 4 5 ''' ''' 栈帧空间 : 负责运行函数而开辟的空间 (1)递归函数整体过程: 调用一层函数就是开辟一层栈帧空间,结束一层函数,就是释放一层栈帧空间, 递归函数实际上就是开辟和释放栈帧空间的过程 (2)递归函数回的过程: 如果函数走到最后一层执行结束了,要回到上一层空间函数调用处,继续向下执行,直到所有代码执行完毕, 在触发触底反弹操作,回到上一层空间函数调用处,以此类推... 直到所有的函数全都释放掉,那么这个递归函数彻底终止. (3)写递归函数的时候切记要加上一个终止的条件,否则会发生内存溢出,如果层数过多,不推荐使用递归. '''