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实现读取目录所有文件的文件名并保存到txt文件代码
Nov 22 Python
进一步理解Python中的函数编程
Apr 13 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Python读取Word(.docx)正文信息的方法
Mar 15 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python面向对象实现名片管理系统文件版
Apr 26 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
如何运行.ipynb文件的图文讲解
Jun 27 Python
django中瀑布流写法实例代码
Oct 14 Python
python中的数组赋值与拷贝的区别详解
Nov 26 Python
Python基于yield遍历多个可迭代对象
Mar 12 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提取中文首字母
2008/04/09 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
2015/12/21 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
jQuery第三课 修改元素属性及内容的代码
2010/03/14 Javascript
Ext中下拉列表ComboBox组件store数据格式用法介绍
2013/07/15 Javascript
属于你的jQuery提示框(Tip)插件
2016/01/20 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
Python基于Tkinter的HelloWorld入门实例
2015/06/17 Python
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python程序运行原理图文解析
2018/02/10 Python
通过实例学习Python Excel操作
2020/01/06 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
Python2手动安装更新pip过程实例解析
2020/07/16 Python
CSS3圆角和渐变2种常用功能详解
2016/01/06 HTML / CSS
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
惠普墨西哥官方商店:HP墨西哥
2016/12/01 全球购物
应用艺术毕业生的自我评价
2013/12/04 职场文书
孔子观后感
2015/06/08 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis
Django框架中视图的用法
2022/06/10 Python