详解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 相关文章推荐
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 Python
python绘制多个曲线的折线图
Mar 23 Python
kafka-python批量发送数据的实例
Dec 27 Python
python实现桌面壁纸切换功能
Jan 21 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
关于pymysql模块的使用以及代码详解
Sep 01 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
使用tensorflow DataSet实现高效加载变长文本输入
Jan 20 Python
python 画图 图例自由定义方式
Apr 17 Python
浅析python 动态库m.so.1.0错误问题
May 09 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
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
2018/09/03 PHP
js中小数转换整数的方法
2014/01/26 Javascript
avalonjs实现仿微博的图片拖动特效
2015/05/06 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
Bootstrap每天必学之日期控制
2016/03/07 Javascript
浅谈JS中json数据的处理
2016/06/30 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
在页面中引入js的两种方法(推荐)
2017/08/29 Javascript
详解vuejs2.0 select 动态绑定下拉框支持多选
2019/04/25 Javascript
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
vue-cli在 history模式下的配置详解
2019/11/26 Javascript
Nodejs文件上传、监听上传进度的代码
2020/03/27 NodeJs
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
js代码编写无缝轮播图
2020/09/13 Javascript
JavaScript代码实现微博批量取消关注功能
2021/02/05 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
Python 用户登录验证的小例子
2013/03/06 Python
在Django中创建动态视图的教程
2015/07/15 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
2019/09/24 Python
Python模块相关知识点小结
2020/03/09 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
html5超简单的localStorage实现记住密码的功能实现
2017/09/07 HTML / CSS
松材线虫病防治方案
2014/06/15 职场文书
服务宗旨标语
2014/07/01 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
婚宴主持词
2015/06/30 职场文书