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 相关文章推荐
Python2.x中文乱码问题解决方法
Jun 02 Python
Python实现多线程的两种方式分析
Aug 29 Python
pycharm 解除默认unittest模式的方法
Nov 30 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
Tensorflow训练模型越来越慢的2种解决方案
Feb 07 Python
基于Django OneToOneField和ForeignKey的区别详解
Mar 30 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
Python实现EM算法实例代码
Oct 04 Python
python中如何对多变量连续赋值
Jun 03 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
一个好用的分页函数
2006/11/16 PHP
Yii2使用$this->context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
js中cookie的使用详细分析
2008/05/28 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
jQuery阻止同类型事件小结
2013/04/19 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
js数组转json并在后台对其解析具体实现
2013/11/20 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
2015/05/25 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
jQuery表单设置值的方法
2017/06/30 jQuery
Vue组件内部实现一个双向数据绑定的实例代码
2019/04/04 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[00:37]2016完美“圣”典风云人物:AMS宣传片
2016/12/06 DOTA
Python实现获取操作系统版本信息方法
2015/04/08 Python
Python 实现两个列表里元素对应相乘的方法
2018/11/14 Python
pycharm打开命令行或Terminal的方法
2019/01/16 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
2019/08/24 Python
Python PyPDF2模块安装使用解析
2020/01/19 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
Python之Matplotlib文字与注释的使用方法
2020/06/18 Python
python Tornado框架的使用示例
2020/10/19 Python
生产现场工艺工程师岗位职责
2013/11/28 职场文书
会计应届生的自荐信
2013/12/13 职场文书
应届生自荐信范文
2014/02/21 职场文书
如何写好自荐信
2014/04/07 职场文书
乡镇务虚会发言材料
2014/10/20 职场文书
采购员岗位职责
2015/02/03 职场文书
新郎结婚保证书
2015/02/26 职场文书
2015年党建工作总结
2015/03/30 职场文书
2015年销售工作总结范文
2015/03/30 职场文书