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
时间: 2024-10-13 13:06:59

Python基础篇【第八篇】:剖析递归函数的相关文章

Python 基础【第八篇】变量

1.变量定义: 给数据进行命名,数据的名字就叫做变量 2.变量格式: [变量名] = [值] (注:python变量中名称不能使用以下字符因为已经被Python内部引用 and,as,assert,break,class,continue,def,del,elif,else,except,exec,False,finally, for,from,global,if,import,in,is,lambda,not,None,or,pass,print,raise,return,try, True,

Python自动化 【第八篇】:Python基础-Socket编程进阶

本节内容: Socket语法及相关 SocketServer实现多并发 1. Socket语法及相关 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0) 参数一:地址簇 socket.AF_INET IPv4(默认) socket.AF_INET6 IPv6 socket.AF_UNIX 只能够用于单一的Unix系统进程间通信 参数二:类型 socket.SOCK_STREAM 流式socket , for TCP (默认) socke

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和

Python开发【第八篇】:网络编程 Socket

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对某个指定

Python开发【第八篇】:网络编程

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: fil

Python基础(Django第二篇)

一.Django路由系统 说明:Django中每一个请求的url必须有一个相应的函数来处理,当请求到达时会根据urls.py文件配置的规则从上往下匹配,匹配一条则不再往下匹配. 配置文件:urls.py 配置方式: 静态路由:一个url对应一个views中的函数. 例:url(r'^index/$', views.index), 动态路由:多个URL对应一个views中的函数,此处的url多为正则匹配. 例:url(r'^index/(.*)/$', views.index), 默认路由:当此条

Python基础之【第一篇】

Python简介: python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使 用Python,如:Youtube.Dropbox.BT.Quora(中国知乎).豆瓣.知乎.Google.Yahoo!.Facebook

Python 基础【第五篇】元组和列表

一 .Python之列表: 其实所谓的列表我个人感觉和shell 中的数组是一样的(只是个人见解哦),列表其实说白了就是元素的组合: 格式: Name = [a,b,c,d] 下标: 每一个列表中的元素都对应一个下标下标的起始位为0 比如列表[a,b,c,d] a对应的下标为0 b对应的下标为1 c对应的下标为2 …… 1.1.定义列表: 比如定义列表group 元素分别为(test,11,bbb,343,ccc) >>> group = ["test",11,&qu

Python 基础【第三篇】输入和输出

这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [[email protected]_server py]# touch pytest [[email protected]_server py]# chmod +x pytest 2. 基本输出“print” [[email protected]_server py]# vim pytest #指定python可执行程序路径 #!/u

python基础19 -------面向对象终结篇(介绍python对象中各种内置命令)

一.isinstance()和issubclass()命令 1.isinstance(对象,类型) 用来判定该对象是不是此类型或者说是该对象是不是此类的对象,返回结果为True和False,如图所示. 注:在python3中类和类型做了统一,都叫做类. 2.issubclass(对象(子类),对象(父类)) 用来判定该对象是不是该父类的子类,返回的结果为True或False,如图所示. 二.反射 1.什么是反射? 反射就相当于程序能检测,访问和修改他本身状态和行为的一种能力,相当于自省. 2.p