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 相关文章推荐
matlab中实现矩阵删除一行或一列的方法
Apr 04 Python
python自动重试第三方包retrying模块的方法
Apr 24 Python
Python使用add_subplot与subplot画子图操作示例
Jun 01 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
Python生成器generator用法示例
Aug 10 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
Dec 28 Python
对python中类的继承与方法重写介绍
Jan 20 Python
python获取交互式ssh shell的方法
Feb 14 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
详解Python 重学requests发起请求的基本方式
Feb 07 Python
详解python的super()的作用和原理
Oct 29 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
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
jqTransform美化表单
2015/10/10 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
基于JavaScript实现单选框下拉菜单添加文件效果
2016/06/26 Javascript
浅谈addEventListener和attachEvent的区别
2016/07/14 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
Bootstrap实现翻页效果
2017/11/27 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
2020/02/12 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
Pandas 数据处理,数据清洗详解
2018/07/10 Python
使用Python监视指定目录下文件变更的方法
2018/10/15 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
2019/09/04 Python
pytorch 数据处理:定义自己的数据集合实例
2019/12/31 Python
python add_argument()用法解析
2020/01/29 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
把富文本的回车转为br标签
2019/08/09 HTML / CSS
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
运动会广播稿400字
2014/01/25 职场文书
网络编辑职责
2014/03/01 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
个人租房协议书范本
2014/09/30 职场文书
廉政承诺书2015
2015/04/28 职场文书
家长会开场白和结束语
2015/05/29 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
PHP正则表达式之RCEService回溯
2022/04/11 PHP