详解python中递归函数


Posted in Python onApril 16, 2019

函数执行流程

def foo1(b,b1=3):
   print("foo1 called",b,b1)
 
 def foo2(c):
    foo3(c)
    print("foo2 called",c)
 def foo3(d):
   print("foo3 called",d)
 def main():
   print("main called")
   foo1(100,101)
   foo2(200)
   print("main ending ")

函数执行过程:

  1. 全局帧中生成foo1、foo2、foo3、main函数对象
  2. main函数调用
  3. main中查找内建函数print压栈,将常量字符串压栈,调用函数,弹出栈顶,返回值。
  4. main中全局查找foo1压栈,将常量100、101压栈,调用函数foo1,创建栈帧。print函数压栈,字符串和变量b、b1压栈,调用函数,弹出栈顶,返回值。
  5. main中全局查找foo2函数压栈,将常量200压栈,调用foo2,创建栈帧。foo3函数压栈,变量c引用压栈,调用foo3函数,创建栈帧,foo3中内建函数中查找print压栈,将字符常量和变量d压栈。foo3完成print函数调用后返回。foo2恢复调用,执行print后,返回值,main中foo2调用结束后弹出栈顶,main继续执行print函数调用,弹出栈顶,main函数返回

 函数中压栈,执行流程。

递归Recursion

  1. 函数直接或者间接调用自身就是递归
  2. 递归需要有边界条件、递归前进段,递归返回段
  3. 递归一定需要有边界条件
  4. 当边界条件不满足的时候,递进前进
  5. 当边界条件满足的时候,递归返回

 递归要求

  1. 递归一定要有退出条件,递归调用一定执行到这个退出条件。没有退出条件的递归调用,就是无限调用
  2. 递归调用的深度不宜过深
  3. python对递归调用的深度做了限制,以保护解释器,cpython中递归深度为1000,ipython中递归深度为3000
  4. 超过递归深度限制,抛出RecursionError:maxinum recursion depth exceeded 超出最大深度
  5. sys.getrecursionlimit()是显示最大限制
  6. 对于基于前面或者换位置的时候使用封装和解构更有效

斐波那契数列实现(f(1)=1,f(2)=1,f(3)=f(1)+f(2),f(4)=f(2)+f(3)……)

#斐波那契数列普通循环实现
a,b=0,1
for i in range(4):
  a,b=b,a+b
print(a)

#斐波那契数列函数递归实现
def foo(n): #大量的重复计算
   return 1 if n<3 else foo(n-1)+foo(n-2) 
 
#斐波那契数列函数循环实现
def fn(n,a=0,b=1):
  a,b=b,a+b
  if n==1:
    return a
  return fn(n-1,a,b)

递归的性能

循环稍微复杂一些,但是只要不是死循环,可以多次迭代直至算出结果
递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快会溢出

间接递归

def foo1():
  foo2()
def foo2():
  foo1()

间接递归,是通过别的函数调用了函数自身,但是如果构成了循环递归调用是非常危险的,但是往往这种情况在代码复杂的情况下,还是有可能发生这种调用的,要用代码的规范来避免这种递归调用的发生

递归总结

  1. 递归是一种很自然的表达,符合逻辑思维
  2. 递归相对运行效率低,每一次调用函数都要开辟新的栈帧
  3. 递归有深度限制,如果递归层次太深,函数反复压栈,栈内存很快就溢出了
  4. 如果是有限次数的递归,可以使用递归调用,或者使用循环代替,循环代码稍微复杂一些,但是只要不是死循环,过次迭代直至算出结果
  5. 绝大多数递归,都可以使用循环实现
  6. 即使递归代码很简洁,能不用尽量不使用递归

以上所述是小编给大家介绍的python递归函数详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
进一步了解Python中的XML 工具
Apr 13 Python
python获取从命令行输入数字的方法
Apr 29 Python
Python实现进程同步和通信的方法
Jan 02 Python
详谈Pandas中iloc和loc以及ix的区别
Jun 08 Python
pip install urllib2不能安装的解决方法
Jun 12 Python
pandas的唯一值、值计数以及成员资格的示例
Jul 25 Python
Python json模块dumps、loads操作示例
Sep 06 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
Python爬取微信小程序Charles实现过程图解
Sep 29 Python
python实现学生信息管理系统源码
Feb 22 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 #Python
详解Python连接MySQL数据库的多种方式
Apr 16 #Python
详解Python学习之安装pandas
Apr 16 #Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 #Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 #Python
Python实现连接MySql数据库及增删改查操作详解
Apr 16 #Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 #Python
You might like
重料打造自己的“宝马”---第三代
2021/03/02 无线电
php 遍历数据表数据并列表横向排列的代码
2009/09/05 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
php-redis中的sort排序函数总结
2015/07/08 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
Thinkphp自定义生成缩略图尺寸的方法
2019/08/05 PHP
PHP的静态方法与普通方法用法实例分析
2019/09/26 PHP
Laravel ORM 数据model操作教程
2019/10/21 PHP
用JavaScript实现UrlEncode和UrlDecode的脚本代码
2008/07/23 Javascript
jquery 插件实现图片延迟加载效果代码
2010/02/06 Javascript
深入理解JavaScript定时机制
2010/10/29 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
jQuery 中$(this).index与$.each的使用指南
2014/11/20 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
JavaScript中this的全面解析及常见实例
2019/05/14 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
2019/06/10 jQuery
详解Vue的ref特性的使用
2020/01/24 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
python实现合并两个数组的方法
2015/05/16 Python
python修改操作系统时间的方法
2015/05/18 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
纯HTML5+CSS3制作生日蛋糕(代码易懂)
2016/11/16 HTML / CSS
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
NBA欧洲商店(法国):NBA Europe Store FR
2016/10/19 全球购物
怎么写有吸引力的自荐信
2013/11/17 职场文书
2014年客户经理工作总结
2014/11/20 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫