Fork me on GitHub

递归定义

# ### 递归函数 : 自己调用自己的函数
'''
递:去
归:回
有去有回是递归
'''

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

  

posted @ 2019-05-22 16:10  MR_黄Python之路  阅读(291)  评论(0编辑  收藏  举报