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 生成目录树及显示文件大小的代码
Jul 23 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Python中动态创建类实例的方法
Mar 24 Python
Django中利用filter与simple_tag为前端自定义函数的实现方法
Jun 15 Python
Python面向对象编程基础解析(一)
Oct 26 Python
numpy数组拼接简单示例
Dec 15 Python
3个用于数据科学的顶级Python库
Sep 29 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
Python数据处理篇之Sympy系列(五)---解方程
Oct 12 Python
python web框架Flask实现图形验证码及验证码的动态刷新实例
Oct 14 Python
利用Python批量识别电子账单数据的方法
Feb 08 Python
浅析python中特殊文件和特殊函数
Feb 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
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
PHP 中使用ajax时一些常见错误总结整理
2017/02/27 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
多个jquery.datatable共存,checkbox全选异常的快速解决方法
2013/12/10 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
javascript实现日期时间动态显示示例代码
2015/09/08 Javascript
jQuery+css实现的切换图片功能代码
2016/01/27 Javascript
JavaScript数组方法总结分析
2016/05/06 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
深入解析js轮播插件核心代码的实现过程
2017/04/14 Javascript
JavaScript通过filereader接口读取文件
2017/05/10 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
35个最好用的Vue开源库(史上最全)
2019/01/03 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
vue.js中ref及$refs的使用方法解析
2019/10/08 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
2020/02/01 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python 装饰器使用详解
2017/07/29 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
Python函数式编程指南:对生成器全面讲解
2019/11/19 Python
文言文形式的学生求职信
2013/12/03 职场文书
生产总经理岗位职责
2013/12/19 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
民政局副局长民主生活会个人整改措施
2014/10/04 职场文书
房屋租赁合同解除协议书
2014/10/11 职场文书
服务明星事迹材料
2014/12/29 职场文书
大学班干部竞选稿
2015/11/20 职场文书
导游词之鲁迅祖居
2019/10/17 职场文书
Nginx的基本概念和原理
2022/03/21 Servers