详解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中关于字符串对象的一些基础知识
Apr 08 Python
使用Python生成url短链接的方法
May 04 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
利用python将图片转换成excel文档格式
Dec 30 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
python邮件发送smtplib使用详解
Jun 16 Python
python找出一个列表中相同元素的多个索引实例
Jun 11 Python
python中sort和sorted排序的实例方法
Aug 26 Python
python lambda函数及三个常用的高阶函数
Feb 05 Python
Python Flask框架实现简单加法工具过程解析
Jun 03 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 Python
Django创建一个后台的基本步骤记录
Oct 02 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
Mysql的GROUP_CONCAT()函数使用方法
2008/03/28 PHP
PHP SQLite类
2009/05/07 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
php 字符串替换的方法
2012/01/10 PHP
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
javascript面向对象编程(一) 实例代码
2010/06/25 Javascript
jquery中ajax学习笔记4
2011/10/16 Javascript
JSON格式化输出
2014/11/10 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
jQuery实现二维码扫描功能
2017/01/09 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
2019/11/01 Javascript
react国际化化插件react-i18n-auto使用详解
2020/03/31 Javascript
JS+canvas五子棋人机对战实现步骤详解
2020/06/04 Javascript
Python中内建函数的简单用法说明
2016/05/05 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
2018/04/26 Python
基于Python实现定时自动给微信好友发送天气预报
2018/10/25 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
python对execl 处理操作代码
2020/06/22 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
什么是重载?CTS、CLS和CLR分别做何解释
2012/05/06 面试题
商场中秋节广播稿
2014/01/17 职场文书
庆祝教师节活动方案
2014/01/31 职场文书
趣味体育活动方案
2014/02/08 职场文书
社区科普工作方案
2014/06/03 职场文书
网吧管理制度范本
2015/08/05 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
Python序列化与反序列化相关知识总结
2021/06/08 Python
Ajax实现异步加载数据
2021/11/17 Javascript