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 相关文章推荐
Python3.2中的字符串函数学习总结
Apr 23 Python
Python实现excel转sqlite的方法
Jul 17 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python使用Matplotlib画条形图
Mar 25 Python
python3.6+django2.0+mysql搭建网站过程详解
Jul 24 Python
python pygame实现球球大作战
Nov 25 Python
如何利用pygame实现简单的五子棋游戏
Dec 29 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
使用Django清空数据库并重新生成
Apr 03 Python
python将音频进行变速的操作方法
Apr 08 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 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生成zip文件类实例
2015/04/07 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
Yii 2.0实现联表查询加搜索分页的方法示例
2017/08/02 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
js中AppendChild与insertBefore的用法详细解析
2013/12/16 Javascript
JavaScript原生对象之Date对象的属性和方法详解
2015/03/13 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
jqueryUI tab标签页代码分享
2017/10/09 jQuery
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
详解vue中axios的封装
2018/07/18 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
2019/12/12 Javascript
Vue双向数据绑定(MVVM)的原理
2020/10/03 Javascript
vue.js watch经常失效的场景与解决方案
2021/01/07 Vue.js
Python深入学习之装饰器
2014/08/31 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
2017/08/30 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
如何用python批量调整视频声音
2020/12/22 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
中英文求职信范文
2014/01/27 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
电脑售后服务承诺书
2014/03/27 职场文书
门店业绩提升方案
2014/06/08 职场文书
政法干警核心价值观心得体会
2014/09/11 职场文书
民间借贷协议书范本
2014/10/01 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
nginx访问报403错误的几种情况详解
2022/07/23 Servers