python基础学习之递归函数知识总结


Posted in Python onMay 26, 2021

一、递归函数使用注意点

递归函数一定要编写终止条件,否则将产生无限递归。(死循环)

二、递归的效率问题

  • 递归效率不高,递归层次过多会导致栈溢出。
  • Python中不推荐使用递归。

三、递归函数引入

"""
使用代码循环输出故事:从前有座山,山里有座庙...
"""
# ------------while循环 (暂时忽略死循环)---------------
while True:
    print("从前有座山,山里有座庙...")

# ---------------通过定义一个方法, 在while循环里面调用实现( 暂时忽略死循环)---------------
def func_story():
    print("从前有座山,山里有座庙...")

while True: 
    func_story()

# ---------------使用递归的方法实现循环---------------
def story():
    print("从前有座山,山里有座庙...")
    story()

story()
# 报错:RecursionError: maximum recursion depth exceeded while calling a Python object

四、递归的深度

这里就引申到一个递归的最大深度。

import sys

# 获取最大递归深度
res = sys.getrecursionlimit()
print(res) # 输出:1000

# 递归最大深度:
def func(n):
    print(n)
    n += 1
    func(n)


func(1)  # python 3 打印到998就停止打印了

我们可以设置递归的最大深度。但是能够达到的最大深度,跟电脑配置也有关系:

import sys

# 设置递归的深度
sys.setrecursionlimit(10000)


# 递归最大深度:
def func(n):
    print(n)
    n += 1
    func(n)


func(1)  # python 3 打印到3221就停止打印了

五、通过缓存解决递归限制

通过缓存解决最大递归限制的问题:

  • Python的functools模块中提供了很多高阶函数的操作。
  • lru_cache:缓存功能装饰器,能够缓存相同参数的函数调用结果,可以节约高开销或I/O函数的调用时间。
  • 通过lru_cache装饰递归函数

python基础学习之递归函数知识总结
python基础学习之递归函数知识总结 

六、递归函数使用示例

递归函数示例一:

# 18 20 22 24
def age(n):
    if n == 1:
        return 18
    else:
        return age(n-1) + 2

print(age(1)) # 输出:18
print(age(2)) # 输出:20
print(age(3)) # 输出:22
print(age(4)) # 输出:24

递归函数示例二:打印三级菜单

# 我们有一个这样的三级菜单
menu = {
    "功能测试": {
        "用例管理": {
            "添加用例": {},
            "删除用例": {},
            "复制用例": {}
        },
        "元素管理": {
            "添加元素": {},
            "删除元素": {},
            "复制元素": {}
        },
    },
    "接口测试": {
        "API管理": {
            "添加api": {},
            "删除api": {},
            "复制api": {}
        },
        "环境管理": {
            "添加环境": {},
            "删除环境": {},
            "复制环境": {}
        },
    },
}

def query_menu(menu:dict):
    """
    一级级查询菜单信息
    :return:
    """
    # 用户输入q退出
    while True:
        for k in menu:print(f"当前菜单:{k}")
        key = input(">>>").strip()
        if key == "q": return key
        elif key in menu.keys() and menu[key]:
            res = query_menu(menu[key])
            if res == "q":
                return "q"

query_menu(menu)

输出结果:

python基础学习之递归函数知识总结

到此这篇关于python基础学习之递归函数知识总结的文章就介绍到这了,更多相关python递归函数内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用Python保存网页上的图片或者保存页面为截图
Mar 05 Python
利用python获取某年中每个月的第一天和最后一天
Dec 15 Python
SVM基本概念及Python实现代码
Dec 27 Python
python取数作为临时极大值(极小值)的方法
Oct 15 Python
python 图像平移和旋转的实例
Jan 10 Python
python输入错误后删除的方法
Oct 12 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
Jan 25 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
如何理解python对象
Jun 21 Python
浅谈keras中loss与val_loss的关系
Jun 22 Python
Python爬虫与反爬虫大战
Jul 30 Python
解决hive中导入text文件遇到的坑
Apr 07 Python
TensorFlow的自动求导原理分析
Django分页器的用法你都了解吗
May 26 #Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 #Python
python numpy中multiply与*及matul 的区别说明
May 26 #Python
python文本处理的方案(结巴分词并去除符号)
Django操作cookie的实现
May 26 #Python
pandas中DataFrame检测重复值的实现
You might like
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
discuz authcode 经典php加密解密函数解析
2020/07/12 PHP
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
jquery中通过父级查找进行定位示例
2013/06/28 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
Javascript中拼接大量字符串的方法
2015/02/05 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
高效的jquery数字滚动特效
2015/12/17 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
利用Angular+Angular-Ui实现分页(代码加简单)
2017/03/10 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
Vue项目中使用Vux的安装过程
2018/05/01 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
Python实现的ini文件操作类分享
2014/11/20 Python
简单实现python进度条脚本
2017/12/18 Python
Django CBV与FBV原理及实例详解
2019/08/12 Python
python的json包位置及用法总结
2020/06/21 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
酒鬼酒广告词
2014/03/21 职场文书
个人贷款担保书
2014/04/01 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android