python 递归相关知识总结


Posted in Python onMarch 03, 2021

听到递归总觉得挺高大上的,为什么呢?因为对其陌生,那么今天就来一文记住递归到底是个啥。

不过先别急,一起来看一个问题:求10的阶乘(10!)。

求x的阶乘,其实就是从1开始依次乘到x。那么10的阶乘就是 1*2*3*4*5*6*7*8*9*10

一、非递归方式求阶乘

假如,我们在没接触过递归的情况下,如何去解决这样的问题呢?

最简单粗暴的方式 直接print(1*2*3*4*5*6*7*8*9*10)出结果就行了,结果是3628800。

但是这种方式显然不是我们想要的,那么可以试试用for循环的方式来解决。

def factorial(n):
 """
 n 就是要求的阶乘的数字
 """
 result = n
 for i in range(1, n):
  result *= i

 return result

if __name__ == '__main__':
 print(factorial(10))

二、递归方式求阶乘

1. 什么是递归?

相信大家一定都听过这么一个故事:

从前有座山,山里有做庙,庙里有个老和尚在讲故事,讲的什么呢?
  从前有座山,山里有做庙,庙里有个老和尚在讲故事,讲的什么呢?
    从前有座山,山里有做庙,庙里有个老和尚在讲故事,讲的什么呢?
      ...

其实这种就是递归,说白了,就是自己去引用自己。
那么,递归用在函数中,就可以是这样的:

def factorial():
 factorial() 

if __name__ == '__main__':
 factorial()

在调用函数factorial的时候 在函数中又继续调用factorial,跟上面的故事一样,就可以无穷无尽的递归下去,
直到讲故事的老和尚累晕,以及电脑的内存溢出宕机。

但是,重要的一点,递归只是解决问题的一种方式而已,比如上面的求阶乘,我用for循环一样解决。

2. 递归解决阶乘

如果要用递归解决上面的阶乘问题,可以再进一步了解下递归的整体思想。

递归的整体思想就是,将一个大问题分解成一个个的小问题,直到问题没有办法再继续分解,于是,再去解决问题。
那么,递归式函数就要满足2个条件:

  • 基线条件:问题可以被分解为的最小问题,当满足基线条件时候,递归不再进行
  • 递归条件:继续分解问题

可以用这个思想来尝试用递归的方式解决阶乘的问题。

10! = 10 * 9! # 10的阶乘其实可以看做是10 * 9的阶乘
9! = 9 * 8!  # 9的阶乘可以看做是9 * 8的阶乘
8! = 8 * 7!
...
2! = 2 * 1!
1! = 1

可以看到,最后分解到1的时候就不可再继续分解了,那么1就是基线条件了。

def factorial(n):
 # 基线条件,当满足时,则不再递归
 if n == 1:
  return 1

 # 递归条件,当n不等于1时,继续递归
 return n * factorial(n - 1)

if __name__ == '__main__':
 print(factorial(10))

三、总结

  • 递归:只是解决问题的一种方式,不一定非要用
  • 递归式函数:就是函数自己调用自己
  • 递归的2个条件:基线条件(满足则不再递归)、递归条件(满足则基线递归)
  • 递归跟循环类似:基本可以互相替代
  • 循环编写起来比较容易,阅读起来比较难。递归编写起来比较难,但是阅读容易

以上就是python 递归相关知识总结的详细内容,更多关于python 递归的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现分析apache和nginx日志文件并输出访客ip列表的方法
Apr 04 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
python变量的存储原理详解
Jul 10 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
Python如何使用BeautifulSoup爬取网页信息
Nov 26 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
AUC计算方法与Python实现代码
Feb 28 Python
anaconda3安装及jupyter环境配置全教程
Aug 24 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
Feb 03 Python
使用python实现学生信息管理系统
Feb 25 Python
python通配符之glob模块的使用详解
Apr 24 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 #Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 #Python
神经网络训练采用gpu设置的方式
Mar 03 #Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 #Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 #Python
python上下文管理的使用场景实例讲解
Mar 03 #Python
pip install命令安装扩展库整理
Mar 02 #Python
You might like
世界收音机发展史
2021/03/01 无线电
学习php过程中的一些注意点的总结
2013/10/25 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
Yii框架实现的验证码、登录及退出功能示例
2017/05/20 PHP
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
Angularjs之filter过滤器(推荐)
2016/11/27 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
Python存取XML的常见方法实例分析
2017/03/21 Python
Python实现的手机号归属地相关信息查询功能示例
2017/06/08 Python
Python Flask-web表单使用详解
2017/11/18 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
浅谈Pycharm调用同级目录下的py脚本bug
2018/12/03 Python
解决Django中多条件查询的问题
2019/07/18 Python
Python list与NumPy array 区分详解
2019/11/06 Python
python Shapely使用指南详解
2020/02/18 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
怎么处理XML的中文问题
2015/03/26 面试题
电子信息毕业生自荐信
2013/11/16 职场文书
求职简历中个人的自我评价
2013/12/25 职场文书
刑事附带民事代理词
2015/05/25 职场文书
2015年入党积极分子培养考察意见
2015/08/12 职场文书
2016年国陪研修感言
2015/11/18 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
Golang连接并操作MySQL
2022/04/14 MySQL