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中copy()方法的使用
May 21 Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 Python
python 将md5转为16字节的方法
May 29 Python
更新修改后的Python模块方法
Mar 03 Python
基于django channel实现websocket的聊天室的方法示例
Apr 11 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Python: 传递列表副本方式
Dec 19 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
Django框架安装及项目创建过程解析
Sep 14 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
pycharm 如何取消连按两下shift出现的全局搜索
Jan 15 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
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
laravel orm 关联条件查询代码
2019/10/21 PHP
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
JavaScript 布尔操作符解析  && || !
2012/08/10 Javascript
js单向链表的具体实现实例
2013/06/21 Javascript
RequireJS使用注意细节
2016/05/15 Javascript
jQueryUI中的datepicker使用方法详解
2016/05/25 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
AngularJS实现图片上传和预览功能的方法分析
2017/11/08 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
nodeJS与MySQL实现分页数据以及倒序数据
2020/06/05 NodeJs
js实现点击烟花特效
2020/10/14 Javascript
用Python编写一个每天都在系统下新建一个文件夹的脚本
2015/05/04 Python
python 中字典嵌套列表的方法
2018/07/03 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
python绘制地震散点图
2019/06/18 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
美国零售商店:Blue&Cream
2017/04/07 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
英语专业个人求职自荐信
2013/09/21 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
疾病防治方案
2014/05/31 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
七一晚会主持词
2015/06/29 职场文书
动画《平凡职业成就世界最强》宣布制作OVA
2022/04/01 日漫