# ### 递归函数 : 自己调用自己的函数
'''
递:去
归:回
有去有回是递归
'''
# (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)写递归函数的时候切记要加上一个终止的条件,否则会发生内存溢出,如果层数过多,不推荐使用递归.
'''