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 连接 MySQL 的几种方式详解
Apr 04 Python
Python使用OpenCV进行标定
May 08 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Python查找最长不包含重复字符的子字符串算法示例
Feb 13 Python
Python 学习教程之networkx
Apr 15 Python
Python数据类型之Tuple元组实例详解
May 08 Python
Python3操作Excel文件(读写)的简单实例
Sep 02 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
Python换行与不换行的输出实例
Feb 19 Python
Python 日期与时间转换的方法
Aug 01 Python
python打包多类型文件的操作方法
Sep 21 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
Dec 07 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
php数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
2011/11/02 PHP
destoon在各个服务器下设置URL Rewrite(伪静态)的方法
2014/06/21 Servers
php+ajax无刷新上传图片的实现方法
2016/12/06 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
JavaScript中数据结构与算法(一):栈
2015/06/19 Javascript
Angularjs 滚动加载更多数据
2016/03/17 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
设置jQueryUI DatePicker默认语言为中文
2016/06/04 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
解决vue项目nginx部署到非根目录下刷新空白的问题
2018/09/27 Javascript
微信小程序实现人脸识别登陆的示例代码
2019/04/02 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
超简单的微信小程序轮播图
2019/11/22 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
[56:29]Secret vs Optic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python自动登录126邮箱的方法
2015/07/10 Python
关于python的list相关知识(推荐)
2017/08/30 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python3 replace()函数使用方法
2018/03/19 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
英国最全面的橄榄球联盟门票网站:Live Rugby Tickets
2018/10/06 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
毕业生文员求职信
2013/11/03 职场文书
大二学生自我检讨书
2014/10/23 职场文书
技术入股合作协议书
2016/03/21 职场文书
Spring mvc是如何实现与数据库的前后端的连接操作的?
2021/06/30 Java/Android