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 pdb调试方法分享
Jan 21 Python
Python中实现常量(Const)功能
Jan 28 Python
Python爬虫工程师面试问题总结
Mar 22 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
删除python pandas.DataFrame 的多重index实例
Jun 08 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
Dec 06 Python
java中的控制结构(if,循环)详解
Jun 26 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
python正则过滤字母、中文、数字及特殊字符方法详解
Feb 11 Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 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与ASP
2006/10/09 PHP
用PHP生成静态HTML速度快类库
2007/03/18 PHP
php中通过虚代理实现延迟加载的实现代码
2011/06/10 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
PHP生成sitemap.xml地图函数
2013/11/13 PHP
php实现可逆加密的方法
2015/08/11 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
php-app开发接口加密详解
2018/04/18 PHP
jQuery 性能优化指南(2)
2009/05/21 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
vuejs动态组件给子组件传递数据的方法详解
2016/09/09 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
vue利用axios来完成数据的交互
2018/03/23 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
使用typescript改造koa开发框架的实现
2020/02/04 Javascript
vue实现购物车案例
2020/05/30 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
详解Python当中的字符串和编码
2015/04/25 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Python中的 enum 模块源码详析
2019/01/09 Python
Django保护敏感信息的方法示例
2019/05/09 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
如何使用Pytorch搭建模型
2020/10/26 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
大学生入党思想汇报
2014/01/01 职场文书
办公室主任主任岗位责任制
2014/02/11 职场文书
优秀护士获奖感言
2014/02/20 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
go语言基础 seek光标位置os包的使用
2021/05/09 Golang