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 deff1(depth, a1, a2):6 print("第%s次循环:"%depth,a1,a2)7
8 if depth == 3:9
10 returna1,a211
12 a3 = a1 +a213 r = f1(depth +1, a2, a3)14 returnr15
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 = 134 print("第%s次循环:"%depth,a1,a2) = 第1次循环: 0 135
36 3.在此设置一个条件,只让它循环3次,然后返回循环3次的结果,并会把最后一次的返回值拿出来(先拿在手里)37 if depth == 3:38 return a1,a239 3次的结果:0 1 (第一次)40 1 1 (第二次)41 1 2 (第三次)42
43 4.赋值一个变量a3让其等于a1加a2的和,第一次时a1 = 0, a2 = 1 所以a3 = 144 a3 = a1 + a2 ===> 1 = 0 + 145
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 + 159 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 '''