python中的函数递归和迭代原理解析


Posted in Python onNovember 14, 2019

这篇文章主要介绍了python中的函数递归和迭代原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一、递归

1、递归的介绍

什么是递归?

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

递归要注意的是,它是直接或间接调用自身,所以在使用递归时,必须有一个明确的递归结束条件,称为递归出口,否则,他就会陷入死循环。

尾递归

如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。

python不是一门函数式编程语言,本身不支持尾递归(没有对尾递归做优化),而且对递归的次数有限制,当递归深度超过1000时,会抛出异常,虽然可以通过sys模块修改提柜的深度,,但是因为不是尾递归,仍然要保存栈,内存大小一定,不可能无限递归,而且无限制地递归调用本身是毫无意义的

import sys
sys.getrecursionlimit()
sys.setrecursionlimit(2000) # 修改递归深度为2000

2、递归的应用

递归分为两个阶段:回溯和递推

递推 : 把复杂的问题的求解推到比原问题简单一些的问题的求解;

回溯 : 当获得最简单的情况(递归出口)后,逐步返回,依次得到复杂的解

下面通过一个例子来分析这个过程 :

这是一个十进制转化为二进制的函数,十进制转化为二进制就是 将十进制不断地除以2,直到商为0,然后将余数从后到前排列起来

def Decbin(x):
  result = ''
  if x:
    return Decbin(x // 2) + str(x % 2)
  else:
    return result
print(Decbin(7))

当我们传入x为7时,很明显x不为0,所以我们便进入了下次一循环,注意这时的第一层函数并没有结束,而是一直在等待着下一层函数的返回结果。接着进入了第二层函数,参数为3,很明显也不为0,接着又进入了第三层函数,此时第二层函数也在等待下一层函数的返回结果,以此类推,这就是递归函数的回溯。当我们的参数为0的时候,便会执行else的代码,这时候函数就不再回溯,而是开始往前递推。

python中的函数递归和迭代原理解析

二、迭代与递归

1、什么是迭代?

Python中的迭代是指通过重复执行的代码处理相似的数据集的过程,并且本次迭代的处理数据要依赖上一次的结果继续往下做,上一次产生的结果为下一次产生结果的初始状态,如果中途有任何停顿,都不能算是迭代。常见的for循环遍历对象就是迭代。

2、用python实现递归算法,代码结构较为简单,但效率非常低下,而迭代算法可读性强,执行效率也非常之快。所以在运用递归算法时应谨慎。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
Python实现获取照片拍摄日期并重命名的方法
Sep 30 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
浅谈Python 递归算法指归
Aug 22 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
基于python实现上传文件到OSS代码实例
May 09 Python
基于plt.title无法显示中文的快速解决
May 16 Python
完美解决python针对hdfs上传和下载的问题
Jun 05 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
Python内置类型集合set和frozenset的使用详解
Apr 26 Python
使用python实现对元素的长截图功能
Nov 14 #Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 #Python
python3实现单目标粒子群算法
Nov 14 #Python
python socket 聊天室实例代码详解
Nov 14 #Python
python中dict()的高级用法实现
Nov 13 #Python
python实现的多任务版udp聊天器功能案例
Nov 13 #Python
利用python实现PSO算法优化二元函数
Nov 13 #Python
You might like
DIY实用性框形天线
2021/03/02 无线电
PHP判断是否连接上网络的方法
2015/07/01 PHP
教你识别简单的免查杀PHP后门
2015/09/13 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
js和jquery中循环的退出和继续学习记录
2014/09/06 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
微信小程序仿美团城市选择
2018/06/06 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
微信小程序点击生成朋友圈分享图(遇到的坑)
2020/06/17 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
[01:57]DOTA2上海特锦赛小组赛解说单车采访花絮
2016/02/27 DOTA
Python 中迭代器与生成器实例详解
2017/03/29 Python
浅谈Python中的私有变量
2018/02/28 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
利用Python制作动态排名图的实现代码
2020/04/09 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
房屋出租委托书格式
2014/09/23 职场文书
高三语文复习计划
2015/01/19 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript