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中的闭包总结
Sep 18 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
python3 与python2 异常处理的区别与联系
Jun 19 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
Python3.5内置模块之random模块用法实例分析
Apr 26 Python
使用python写的opencv实时监测和解析二维码和条形码
Aug 14 Python
Python使用tkinter模块实现推箱子游戏
Oct 08 Python
Python3爬虫中Splash的知识总结
Jul 10 Python
Python学习之迭代器详解
Apr 01 Python
关于pytest结合csv模块实现csv格式的数据驱动问题
May 30 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
哪吒敖丙传:新人物二哥敖乙出场 小敖丙奶气十足
2020/03/08 国漫
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
jqueyr判断checkbox组的选中(示例代码)
2013/11/08 Javascript
JavaScript获取页面中超链接数量的方法
2015/11/09 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
Vue在H5 项目中使用融云进行实时个人单聊通讯
2020/12/14 Vue.js
[01:31:03]DOTA2完美盛典全回顾 见证十五项大奖花落谁家
2017/11/28 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
python求解水仙花数的方法
2015/05/11 Python
python开发之字符串string操作方法实例详解
2015/11/12 Python
python中PIL安装简单教程
2016/04/21 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
Python高斯消除矩阵
2019/01/02 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
python 进程池pool使用详解
2020/10/15 Python
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
英国第一豪华护肤品牌:Elemis
2017/10/12 全球购物
精美的手工家居和生活用品:Nkuku
2019/11/01 全球购物
EJB的激活机制
2013/10/25 面试题
师范应届生语文教师求职信
2013/10/29 职场文书
财产公证书样本
2014/04/04 职场文书
承诺书格式
2014/06/03 职场文书
乡镇2014法制宣传日活动总结
2014/11/01 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书
python爬虫selenium模块详解
2021/03/30 Python
Vue的过滤器你真了解吗
2022/02/24 Vue.js
解决redis批量删除key值的问题
2022/03/23 Redis
python开发制作好看的时钟效果
2022/05/02 Python