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