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 深入理解yield
Sep 06 Python
简单介绍Python中的JSON使用
Apr 28 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
Python3 伪装浏览器的方法示例
Nov 23 Python
Python操作MySQL模拟银行转账
Mar 12 Python
Python整数与Numpy数据溢出问题解决
Sep 11 Python
pygame库实现俄罗斯方块小游戏
Oct 29 Python
基于Python获取docx/doc文件内容代码解析
Feb 17 Python
使用python实现名片管理系统
Jun 18 Python
Python中qutip用法示例详解
Oct 02 Python
python中os.path.join()函数实例用法
May 26 Python
python中pymysql包操作数据库方法
Apr 19 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
php数组删除元素示例
2014/03/21 PHP
php实现curl模拟ftp上传的方法
2015/07/29 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
一个原生的用户等级的进度条
2010/07/03 Javascript
javascript操作JSON的要领总结
2012/12/09 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
js仿苹果iwatch外观的计时器代码分享
2015/08/26 Javascript
深入探究AngularJS框架中Scope对象的超级教程
2016/01/04 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
javascript中this关键字详解
2016/12/12 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
jquery图片预览插件实现方法详解
2019/07/18 jQuery
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
微信小程序picker组件两列关联使用方式
2020/10/27 Javascript
vue实现购物车的小练习
2020/12/21 Vue.js
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
浅谈python类属性的访问、设置和删除方法
2016/07/25 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
Python优先队列实现方法示例
2017/09/21 Python
Python实现的计算器功能示例
2018/04/26 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
python实现的生成word文档功能示例
2019/08/23 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
2019/10/14 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
Pytorch 卷积中的 Input Shape用法
2020/06/29 Python
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
如何进行有效的自我评价
2013/09/27 职场文书
早会主持词
2014/03/17 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
停车场管理协议书范本
2014/10/08 职场文书