Python基础篇【第八篇】:剖析递归函数

递归函数

如果函数中包含了对其自身的调用,该函数就是递归函数!

先介绍一下斐波那契数列:斐波那契数列成为黄金分割数列,表现形式0、1、1、2、3、5、8、13、21、34、.......

可以看出前两个的数的和等于第三个数0 + 1 = 1,1 + 1 = 2 , 1 + 2 = 3 ......

通过斐波那契数列剖析递归函数:

 1 #!/usr/bin/env python3
 2 #通过斐波那契数列详细剖析递归函数
 3 #0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657
 4 
 5 def f1(depth, a1, a2):
 6     print("第%s次循环:"%depth,a1,a2)
 7     
 8     if depth == 3:
 9         
10         return a1,a2
11     
12     a3 = a1 + a2
13     r = f1(depth +1, a2, a3)
14     return r
15 
16 ret = f1(1,0,1)
17 print(ret)
18 
19 '''
20 代码分析:
21 depth:为了明确分析每一步的操作和状态
22 a1:从初始目的要得到斐波那契数
23 a2:从斐波那契数列中可以看到前两个数的和等于第三个数
24 程序开始从上往下依次执行:
25     1.看到函数时首先把整个函数放到内存中
26     2.执行到下一步看到带着实参(1,0,1)的函数名字(f1)赋值到了一个变量上(ret),执行函数
27     3.再继续执行的时候函数中的结果给输出出来
28     执行函数的流程:
29 
30         1.实参传入到放在内存的函数相对应的形参中去(depth = 1, a1 = 0, a2 = 1)
31             def f1(depth = 1, a1 = 0, a2 = 1):
32 
33                 2.%s站位符,%depth此刻等于1, a1 = 0, a2 = 1
34                 print("第%s次循环:"%depth,a1,a2) = 第1次循环: 0 1
35 
36                 3.在此设置一个条件,只让它循环3次,然后返回循环3次的结果,并会把最后一次的返回值拿出来(先拿在手里)
37                 if depth == 3:
38                     return a1,a2
39                       3次的结果:0 1 (第一次)
40                                1 1 (第二次)
41                                1 2 (第三次)
42 
43                 4.赋值一个变量a3让其等于a1加a2的和,第一次时a1 = 0, a2 = 1 所以a3 = 1
44                 a3 = a1 + a2 ===> 1 = 0  + 1
45 
46                 5.当程序执行到这时看到一个变量r,变量的内容可以看到f1这个名字,这个是函数的名字,在这的意思就是调用其函数本身,这就是递归了!
47                 f1(depth +1, a2, a3)这段代码的意思就是调用自身,把depth +1, a2, a3传入到函数本身的参数中去.
48                 所以当前r = f1(depth +1, a2, a3) ===> r = f1(2, 1, 1)
49                 得到这个r这个变量的值的时候往下执行看到'return r',return返回值会把刚刚r变量刚刚得到的值当做函数的实参,重新传入到函数的形参中里.
50                 这也是第二次循环开始的地方!所以第二次循环开始的方式就是:
51 
52                        开始                                                             第一次
53 
54                 def f1(depth, a1, a2):                                  def f1(1, 0, 1):
55                     print("第%s次循环:"%depth,a1,a2)                         print("第%s次循环:"%depth,0,1)
56                     if depth == 1:                                          if depth == 1:          #循环一次,满足条件
57                         return a1,a2                                            return 0,1          #第一次返回的值
58                     a3 = a1 + a2                                                1 = 0 + 1
59                     r = f1(depth +1, a2, a3)                                    r = f1(2, 1, 1)     #第二次开始的地方
60                     return r                                                    return r            #把值返回到函数中
61 
62                 ret = f1(1,0,1)                                         ret = f1(1,0,1)
63                 print(ret)                                              print(ret)
64 
65                     第二次
66 
67                 def f1(2, 1, 1):
68                     print("第%s次循环:"%depth,1,1)
69                     if depth == 2:      #第二次循,满足条件
70                         return 1,1      #第二次返回的值
71                     2 = 1 + 1                                                   第N次...
72                     r = f1(3, 1, 2)     #第三次开始的地方
73                     return r            #把值传入到函数中
74 
75                 ret = f1(1,0,1)
76                 print(ret)
77 '''

以上得到的结果:

1 /Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5 /Users/zk/PycharmProjects/old_boy/day07/递归函数.py
2 第1次循环: 0 1
3 第2次循环: 1 1
4 第3次循环: 1 2
5 (1, 2)
6 
7 Process finished with exit code 0

 

posted @ 2016-05-12 18:38  汪汪小喵咪  阅读(302)  评论(1编辑  收藏  举报