导航

递归&栈帧空间

Posted on 2019-03-27 23:05  菜花教授  阅读(382)  评论(0编辑  收藏  举报

递归函数: 自己调用自己的函数

1 def digui(n):
2    print(n)
3    if n > 0:
4       digui(n-1)
5    print(n)
6    
7 digui(5)

执行结果:

 1 5
 2 4
 3 3
 4 2
 5 1
 6 0
 7 0
 8 1
 9 2
10 3
11 4
12 5

执行过程:

 1 """
 2 
 3 代码从上到下执行:
 4 digui(5)
 5 print 5
 6    digui(4)
 7    print 4
 8       digui(3)
 9       print 3
10          digui(2)
11          print 2
12             digui(1)
13             print 1
14                digui(0)
15                print 0
16                n !> 0
17                print 0
18 
19                最内层的函数已经结束
20                开始向外面跳转
21                
22             print 1
23          print 2
24       print 3
25    print4 
26 prin 5
27 """
 1 """
 2 去的过程:
 3 n = 5  print 5    n > 0  digui(5-1)
 4 n = 4  print 4    n > 0  digui(4-1)
 5 n = 3  print 3       n > 0  digui(3-1)
 6 n = 2  print 2       n > 0  digui(2-1)
 7 n = 1  print 1       n > 0  digui(1-1)
 8 n = 0  print 0       n !=0  print 0
 9 
10 
11 digui (0)调用结束
12 开始返回
13 
14 
15 
16 回的过程:
17 n = 1  print 1    digui(1)   结束
18 n = 2  print 2       digui(2)   结束
19 n = 3  print 3       digui(3)   结束
20 n = 4  print 4       digui(4)   结束
21 n = 5  print 5       digui(5)   结束
22 整个函数执行完毕
23 """

阶乘的执行

 1 def jiecheng(n):
 2    if n <= 1:
 3       return 1
 4    return jiecheng(n-1) * n 
 5 
 6 
 7 print(jiecheng(5))
 8 
 9 """
10 先计算return后面的表达式, 计算完毕后再返回
11 
12 去的过程:
13 n = 5  jiechneg(5-1)*5
14 n = 4  jiecheng(4-1)*4
15 n = 3  jiecheng(3-1)*3
16 n = 2  jiecheng(2-1)*2
17 n = 1  if return 1
18 
19 # 此时最内层代码执行完毕, return返回1
20 
21 
22 # 开始执行返回过程
23 n = 2  jiecheng(2-1)*2       1*2
24 n = 3  jiecheng(3-1)*3       1*2*3
25 n = 4  jiecheng(4-1)*4       1*2*3*4
26 n = 5  jiecheng(5-1)*5       1*2*3*4*5

栈帧空间:

 1 """
 2 栈帧空间就是运行函数的, 
 3 调用函数就是开辟一个新的栈帧空间, 
 4 调用结束后会自动释放栈帧空间
 5 """
 6 
 7 
 8 
 9 """
10 去的过程:
11 没调用一个函数就开辟一块新的栈帧空间, 
12 每结束一个变量, 就释放一个栈帧空间
13 递归本质上就是开辟和释放栈帧空间的过程
14 
15 
16 回的过程: 需要触底反弹
17 1.当前这层栈帧空间的代码全部执行完毕,
18 会自动回到上一层函数的调用处
19 
20 2.当前函数遇到return会终止当前函数
21 回到上一层函数的调用处
22 
23 """