Python之递归函数
时间:2022-05-03
本文章向大家介绍Python之递归函数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Python之递归函数 好久没有更新内容了,也好久没有给大家打个招呼了,小白想死你们了。今天跟大家说说Python中的递归函数。
Python是支持递归函数的。简单地说,一个递归函数就是直接或间接地调用自身的函数,并且要有退出条件。枯燥的概念令人生厌,我们直接来个例子看看递归函数是如何工作的。
例如我们对一个数字列表进行求和计算,我们可以使用内置的sum
函数或者自己写一个函数来完成计算工作,接下来我们看看如何使用递归来完成求和运算:
In[1]: def mysum(L):
...: if not L:
...: return 0
...: else:
...: return L[0] + mysum(L[1:])
...:
In[2]: mysum([1, 2, 3, 4, 5])
Out[2]: 15
如果对上面的函数较为困惑,可以使用print
函数来打印每次递归时列表L
的值:
In[3]: def mysum(L):
...: print(L)
...: if not L:
...: return 0
...: else:
...: return L[0] + mysum(L[1:])
...:
In[4]: mysum([1, 2, 3, 4, 5])
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5]
[4, 5]
[5]
[]
Out[4]: 15
通过上述的输出可以发现:每次递归时,列表的长度都变短了,直到列表变为空时,递归终止。
对于上面的代码,我们可以使用另外一种代码形式来实现,也就是使用三目运算符,然而在Python中是没有三目运算符的,不过可以使用if/else
来实现,代码如下:
In[1]: def mysum(L):
...: return 0 if not L else L[0] + mysum(L[1:])
...:
In[2]: mysum([1, 2, 3, 4, 5])
Out[2]: 15
说到递归还有一个阶乘的例子要个大家说说:
In[5]: def factorial(number):
...: if number <=1:
...: return 1
...: else:
...: return number * factorial(number-1)
...:
In[6]: for i in range(11):
...: print("{0:2}! = {1}".format(i, factorial(i)))
...:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
如果计算factorial(5)
,可以根据函数定义看到其计算过程:
===> factorial(5)
===> 5 * factorial(4)
===> 5 * (4 * factorial(3))
===> 5 * (4 * (3 * factorial(2)))
===> 5 * (4 * (3 * (2 * factorial(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack) 这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函 数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的 次数过多,会导致栈溢出。可以试试factorial(1000):
>>> factorial(1000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in factorial
...
File "<stdin>", line 4, in factorial
RuntimeError: maximum recursion depth exceeded
使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。
今天的内容就到这里,明天继续。
- 分布式监控系统Zabbix3.2给异常添加邮件报警
- 分布式监控系统Zabbix3.2跳坑指南
- 一图看懂java内存模型
- 零代码如何打造自己的实时监控预警系统
- 一步一步在Windows中使用MyCat负载均衡 上篇
- 你真的会玩SQL吗?之逻辑查询处理阶段
- javascript中如何正确将日期(Date)字符串转换为日期(Date)对象?
- 全面迎接.Net3.0时代的到来(WCF/WF/WPF/LINQ)
- SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易
- [基础]datagridview绑定数据源的几种常见方式
- c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸
- 在非SqlServer数据库上实现MemberShip和Role功能(自定义MemberShipProvider和RoleProvider)
- 一种实用的表格行鼠标点击高亮效果
- Lucene:QueryParser中操作符的疑惑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Laravel 默认邮箱登录改成用户名登录的实现方法
- Android Studio实现简单计算器APP
- 基于PHP实现微信小程序客服消息功能
- python gstreamer实现视频快进/快退/循环播放功能
- php tpl模板引擎定义与使用示例
- ThinkPHP5&5.1框架关联模型分页操作示例
- Android实现简易计算器(可以实现连续计算)
- PHP实现提高SESSION响应速度的几种方法详解
- ThinkPHP5.1框架数据库链接和增删改查操作示例
- 新版Flutter集成到已有Android项目的实现
- PHP基于session.upload_progress 实现文件上传进度显示功能详解
- Android实现加法计算器
- Android使用Realm数据库实现App中的收藏功能(代码详解)
- Android实现简单加法计算器
- Android实现两个数相加功能