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实现给字典添加条目的方法
Sep 25 Python
python中MySQLdb模块用法实例
Nov 10 Python
Python单例模式实例分析
Jan 14 Python
Python监控主机是否存活并以邮件报警
Sep 22 Python
django模板加载静态文件的方法步骤
Mar 01 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
python实现超市商品销售管理系统
Oct 25 Python
Python简易计算器制作方法代码详解
Oct 31 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
Jan 24 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Python类型转换的魔术方法详解
Dec 23 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 select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解决办法
2014/05/04 PHP
php异常处理方法实例汇总
2015/06/24 PHP
javascript 闭包
2011/09/15 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
浅析JavaScript 调试方法和技巧
2015/10/22 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
jQuery实现的多滑动门,多选项卡效果代码
2016/03/28 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
2016/08/26 Javascript
微信小程序 template模板详解及实例
2017/02/21 Javascript
js推箱子小游戏步骤代码解析
2018/01/10 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
python 多个参数不为空校验方法
2019/02/14 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
Python中查看变量的类型内存地址所占字节的大小
2019/06/26 Python
Python3视频转字符动画的实例代码
2019/08/29 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
《雪地里的小画家》教学反思
2014/02/22 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
医院合作协议书
2014/08/19 职场文书
甜品蛋糕店创业计划书
2014/09/21 职场文书