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递归函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PyTorch Dataset与DataLoader使用超详细讲解

    PyTorch Dataset与DataLoader使用超详细讲解

    用于处理数据样本的代码可能会变得凌乱且难以维护;理想情况下,我们希望数据集代码与模型训练代码解耦,以获得更好的可读性和模块化。PyTorch提供的torch.utils.data.DataLoader和torch.utils.data.Dataset允许你使用预下载的数据集或自己制作的数据
    2022-10-10
  • Django实现文件分享系统的完整代码

    Django实现文件分享系统的完整代码

    这篇文章主要介绍了Django实现文件分享系统,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • python使用re模块爬取豆瓣Top250电影

    python使用re模块爬取豆瓣Top250电影

    这篇文章主要介绍了python使用re模块爬取豆瓣Top250电影的示例,帮助大家更好的理解和学习python 爬虫,感兴趣的朋友可以了解下
    2020-10-10
  • Python神器之使用watchdog监控文件变化

    Python神器之使用watchdog监控文件变化

    这篇文章主要为大家详细介绍了Python中的神器watchdog以及如何使用watchdog监控文件变化,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2023-12-12
  • 从源码解析Python的Flask框架中request对象的用法

    从源码解析Python的Flask框架中request对象的用法

    Flask中的request对象发送请求使用起来十分方便,但也有一些需要注意的地方,这里我们来从源码解析Python的Flask框架中request对象的用法,需要的朋友可以参考下.
    2016-06-06
  • Python控制台实现交互式环境执行

    Python控制台实现交互式环境执行

    这篇文章主要介绍了Python程序如何在交互式环境中执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • PyTorch实现卷积神经网络的搭建详解

    PyTorch实现卷积神经网络的搭建详解

    这篇文章主要为大家介绍了PyTorch实现卷积神经网络的搭建详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python如何写出表白程序

    python如何写出表白程序

    在本篇文章里小编给大家分享的是一篇关于python实现表白程序的代码实例,需要的朋友们可以参考下。
    2020-06-06
  • Python中操作符重载用法分析

    Python中操作符重载用法分析

    这篇文章主要介绍了Python中操作符重载用法,较为详细的分析了Python操作符重载的功能,使用方法与相关注意事项,需要的朋友可以参考下
    2016-04-04
  • TensorFlow教程Softmax逻辑回归识别手写数字MNIST数据集

    TensorFlow教程Softmax逻辑回归识别手写数字MNIST数据集

    这篇文章主要为大家介绍了python神经网络的TensorFlow教程基于Softmax逻辑回归识别手写数字的MNIST数据集示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-11-11

最新评论