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

 更新时间:2021年05月26日 11:55:14   作者:florachy  
在函数中调用函数自身,我们把这样的函数叫做递归函数, 递归函数就是循环的调用,类似于俄罗斯套娃,本文给各位小伙伴详细介绍了python递归函数,需要的朋友可以参考下

一、递归函数使用注意点

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

二、递归的效率问题

  • 递归效率不高,递归层次过多会导致栈溢出。
  • 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装饰递归函数

在这里插入图片描述
在这里插入图片描述 

六、递归函数使用示例

递归函数示例一:

# 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安装教程全过程(2022最新)

    Python安装教程全过程(2022最新)

    这篇文章主要介绍了Python安装教程全过程(2022最新版本),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Python中判断subprocess调起的shell命令是否结束

    Python中判断subprocess调起的shell命令是否结束

    这篇文章主要介绍了Python中判断subprocess调起的shell命令是否结束的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 利用Python制作自已的动态屏保

    利用Python制作自已的动态屏保

    这篇文章主要为大家详细介绍了如何利用Python制作自已的动态屏保,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下
    2022-12-12
  • Python解惑之整数比较详解

    Python解惑之整数比较详解

    这篇文章主要给大家介绍了Python中整数比较的相关资料,文中通过示例代码介绍的非常详细,详细会对大家学习python的整数具有一定的参考价值,需要的朋友下面跟着小编一起来学习学习吧。
    2017-04-04
  • Python二维码生成识别实例详解

    Python二维码生成识别实例详解

    这篇文章主要介绍了Python二维码生成识别实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 浅析Python如何实现Celery任务队列系统

    浅析Python如何实现Celery任务队列系统

    这篇文章主要为大家详细介绍了一个基于 Celery 和 Redis 的分布式任务队列系统,用于处理异步任务和定时任务,希望对大家有一定的帮助
    2025-04-04
  • Python基础之Spyder的使用

    Python基础之Spyder的使用

    Spyder是一个用于科学计算的使用Python编程语言的集成开发环境(IDE),它结合了综合开发工具的高级编辑、分析、调试等功能,需要的朋友可以参考下
    2023-05-05
  • Python Beautiful Soup模块使用教程详解

    Python Beautiful Soup模块使用教程详解

    Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 中常用的页面解析库,它可以从 HTML 或 XML 文档中快速地提取指定的数据,这篇文章主要介绍了Python Beautiful Soup模块的使用
    2023-02-02
  • 一文详解如何使用Python从字符串中提取数字

    一文详解如何使用Python从字符串中提取数字

    这篇文章主要给大家介绍了关于如何使用Python从字符串中提取数字的相关资料,我们在进行数据处理时候,可能想要提取字符串中的数字进行分析,需要的朋友可以参考下
    2023-11-11
  • 使用python处理题库表格并转化为word形式的实现

    使用python处理题库表格并转化为word形式的实现

    这篇文章主要介绍了使用python处理题库表格并转化为word形式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论