Python - 递归函数(Recursive Function)的速度优化 (Python实现)

news2024/10/7 16:17:22

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/140137432

免责声明:本文来源于个人知识与开源资料,仅用于学术交流,不包含任何商业技术,欢迎相互学习,不支持转载。


Recursive

递归函数 是特殊的编程技术,通过调用自身来解决问题。递归函数通常包含两个关键部分:基线条件(Base Case)递归步骤(Recursive Step),包括:

  • 递归函数(Recursive Function):递归函数是调用自身的函数。允许程序,通过将问题分解为更小的、更易于管理的子问题,来解决问题。递归函数通常用于解决可以自然分解为相似子问题的问题,如树的遍历、排序算法(如快速排序和归并排序)等。
  • 基线条件(Base Case):基线条件是递归函数中,用来停止递归调用的条件。没有基线条件,递归将无限进行下去,最终导致栈溢出错误。基线条件通常是一个或多个特定情况,当满足这些条件时,递归函数将返回一个不需要进一步递归调用的值。
  • 结果缓存(Memoization):结果缓存是一种优化技术,用于存储递归函数的计算结果,以避免重复计算相同的子问题。这在具有大量重复计算的递归算法中非常有用。通过缓存结果,显著提高递归函数的性能,在 Python 中,使用字典结构 dict() 作为缓存。
  • LRU 缓存装饰器(LRU Cache Decorator):LRU,即 Least Recently Used,是常用于缓存最近最少使用的数据的数据结构。LRU缓存装饰器可以应用于递归函数,以实现自动的结果缓存和过期策略。这有助于管理内存使用,提高具有大量重复调用的递归函数的性能。
  • 生成器(Generator):生成器是一种特殊的迭代器,允许惰性地生成值,即一次生成一个值,而不是一次性生成所有值。在 Python 中,生成器使用 yield 关键字实现。生成器对于处理大型数据集或实现复杂的迭代逻辑非常有用,并且可以与递归结合使用,以简化代码并提高效率。

运行效率排序:迭代 > LRU 缓存 > 字典缓存 > 普通递归

即:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2024. All rights reserved.
Created by C. L. Wang on 2024/7/2
"""

import time


def fib2(n):
    """
    递归实现斐波那契数列
    """
    if n <= 1:  # 基线条件
        return n
    return fib2(n - 2) + fib2(n - 1)


memo = {0: 0, 1: 1}


def fib3(n):
    """
    递归实现斐波那契数列,使用字典缓存
    """
    if n in memo:
        return memo[n]
    memo[n] = fib3(n - 2) + fib3(n - 1)
    return memo[n]


from functools import lru_cache


@lru_cache(maxsize=None)
def fib4(n):
    """
    递归实现斐波那契数列,使用lru_cache缓存
    """
    if n <= 1:  # 基线条件
        return n
    return fib4(n - 2) + fib4(n - 1)


def fib5(n):
    """
    迭代实现斐波那契数列
    """
    if n == 0:
        return 0
    last, _next = 0, 1
    for _ in range(1, n):
        last, _next = _next, last + _next
    return _next


def fib6(n):
    """
    生成器输出斐波那契数列
    """
    yield 0
    if n > 0:
        yield 1
    last, _next = 0, 1
    for _ in range(1, n):
        last, _next = _next, last + _next
        yield _next


if __name__ == '__main__':
    s_time = time.time()
    print(f"fib2: {fib2(30)}, time: {(time.time() - s_time)*1000:.4f} ms")
    s_time = time.time()
    print(f"fib3: {fib3(30)}, time: {(time.time() - s_time)*1000:.4f} ms")
    s_time = time.time()
    print(f"fib4: {fib4(30)}, time: {(time.time() - s_time)*1000:.4f} ms")
    s_time = time.time()
    print(f"fib5: {fib5(30)}, time: {(time.time() - s_time)*1000:.4f} ms")
    for i in fib6(10):
        print(i, end=' ')

运行输出:

fib2: 832040, time: 213.8369 ms
fib3: 832040, time: 0.0222 ms
fib4: 832040, time: 0.0148 ms
fib5: 832040, time: 0.0043 ms
0 1 1 2 3 5 8 13 21 34 55 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1886924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

英灵神殿mac能玩吗 英灵神殿对电脑配置要求《英灵神殿》新手攻略查询 PD虚拟机能玩英灵神殿吗

近年来&#xff0c;随着《英灵神殿》&#xff08;Valheim&#xff09;游戏的火热&#xff0c;越来越多的玩家被其独特的北欧神话题材和丰富的生存挑战所吸引。然而&#xff0c;对于Mac用户来说&#xff0c;如何在Mac平台上运行这款游戏可能是一个问题。此外&#xff0c;作为一名…

闲聊 .NET Standard

前言 有时候&#xff0c;我们从 Nuget 下载第三方包时&#xff0c;会看到这些包的依赖除了要求 .NET FrameWork、.NET Core 等的版本之外&#xff0c;还会要求 .NET Standard 的版本&#xff0c;比如这样&#xff1a; 这个神秘的 .NET Standard 是什么呢&#xff1f; .NET St…

JAVA连接FastGPT实现流式请求SSE效果

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排&#xff0c;从而实现复杂的问答场景&#xff01; 一、先看效果 真正实流式请求&#xff0c;SSE效果&#xff0c;SSE解释&am…

【CH32V305FBP6】USBD HS 虚拟串口分析

文章目录 前言分析端点 0USBHS_UIS_TOKEN_OUT 端点 2USBHS_UIS_TOKEN_OUTUSBHS_UIS_TOKEN_IN 前言 虚拟串口&#xff0c;端口 3 单向上报&#xff0c;端口 2 双向收发。 分析 端点 0 USBHS_UIS_TOKEN_OUT 设置串口参数&#xff1a; 判断 USBHS_SetupReqCode CDC_SET_LIN…

AutoCAD Mechanical下载安装;Mechanical针对机械设计领域开发的CAD软件下载安装!

在AutoCAD Mechanical的助力下&#xff0c;用户能够轻松应对二维绘图与三维建模两大核心任务。二维绘图方面&#xff0c;软件提供了精准且灵活的绘图工具&#xff0c;使得工程师能够迅速勾勒出机械部件的轮廓与细节&#xff0c;大大提高了工作效率。 而在三维建模方面&#xff…

由于找不到d3dx9_43.dll是什么意思?教你快速修复d3dx9_43.dll

由于找不到d3dx9_43.dll是什么意思&#xff1f;就是d3dx9_43.dll文件丢失了&#xff0c;你的某些程序加载不出来了&#xff01;需要你去修复了d3dx9_43.dll文件&#xff0c;你的程序才可以正常运行&#xff0c;今天我们就来给大家详细的说说找不到d3dx9_43.dll的详细分析。 一.…

kaggle量化赛金牌方案(第七名解决方案)

获奖文章(第七名解决方案) 致谢 我要感谢 Optiver 和 Kaggle 组织了这次比赛。这个挑战提出了一个在金融市场时间序列预测领域中具有重大和复杂性的问题。 方法论 我的方法结合了 LightGBM 和神经网络模型,对神经网络进行了最少的特征工程。目标是结合这些模型以降低最终…

C++初学者指南-3.自定义类型(第一部分)-析构函数

C初学者指南-3.自定义类型(第一部分)-析构函数 文章目录 C初学者指南-3.自定义类型(第一部分)-析构函数特殊的成员函数用户定义的构造函数和析构函数RAII示例&#xff1a;资源处理示例&#xff1a;RAII记录零规则 特殊的成员函数 T::T()默认构造函数当创建新的 T 对象时运行。…

Linux指定文件权限的两种方式-符号与八进制数方式示例

一、指定文件权限可用的两种方式&#xff1a; 对于八进制数指定的方式&#xff0c;文件权限字符代表的有效位设为‘1’&#xff0c;即“rw-”、“rw-”、“r--”&#xff0c;以二进制表示为“110”、“110”、“100”&#xff0c;再转换为八进制6、6、4&#xff0c;所以777代表…

Golang中defer和return顺序

在Golang中&#xff0c;defer 和 return 的执行顺序是一个重要的特性&#xff0c;它们的执行顺序如下&#xff1a; return语句不是一条单独的语句&#xff0c;实际上&#xff0c;它是由赋值和返回两部分组成的。赋值步骤会先执行&#xff0c;这一步会计算return语句中的表达式…

【YOLOv5进阶】——引入注意力机制-以SE为例

声明&#xff1a;笔记是做项目时根据B站博主视频学习时自己编写&#xff0c;请勿随意转载&#xff01; 一、站在巨人的肩膀上 SE模块即Squeeze-and-Excitation 模块&#xff0c;这是一种常用于卷积神经网络中的注意力机制&#xff01;&#xff01; 借鉴代码的代码链接如下&a…

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…

大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容?

环境: Excel2016 问题描述: 大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容? 解决方案: 遇到这种情况,说明Excel文件非常大,超出了你当前计算机配置的处理能力。以下是一些解决方法,帮助你尝试打开或…

【Arduino】XIAOFEIYU实验ESP32使用TOUCH触摸模块(图文)

今天XIAOFEIYU继续来实验ESP32使用传感器模块&#xff0c;这次用到的模块为TOUCH触摸模块。 三个针脚分别为正负极&#xff0c;IO针脚。 #define pin 25void setup(){Serial.begin(9600); pinMode(pin, INPUT); }float value 0.0; void loop(){value digitalRead(pin); …

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨&#xff0c;知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想&#xff1a;完全由神经网络驱动的计算机&#xff0c;不再依赖传统的软件代码。 嗯&#xff0c;这是什么意思&#xff1f;全部原生LLM硬件设备的意思吗&#xff1f…

编译原理3-自底向上的语法分析

自底向上分析 &#xff0c;就是自左至右扫描输入串&#xff0c;自底向上进 行分析&#xff1b;通过反复查找当前句型的 句柄&#xff0c; 并使 用产生式规则 将找到的句柄归约为相应的非终结符 。逐步进行“ 归约 ”&#xff0c;直到至文法的开始符号&#xff1b; 对于规范推导…

详解反向传播(BP)算法

文章目录 what&#xff08;是什么&#xff09;where&#xff08;用在哪&#xff09;How&#xff08;原理&&怎么用&#xff09;原理以及推导过程pytorch中的反向传播 what&#xff08;是什么&#xff09; 反向传播算法&#xff08;Backpropagation&#xff09;是一种用于…

为什么是视频传输用YUV格式,而放弃RGB格式?

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《音视频》系列专栏&…

如何寻找一个领域的顶级会议,并且判断这个会议的影响力?

如何寻找一个领域的顶级会议&#xff0c;并且判断这个会议的影响力&#xff1f; 会议之眼 快讯 很多同学都在问&#xff1a;学术会议不是期刊&#xff0c;即使被SCI检索&#xff0c;也无法查询影响因子。那么如何知道各个领域的顶级会议&#xff0c;并对各个会议有初步了解呢…

Qt加载SVG矢量图片,放大缩小图片质量不发生变化。

前言&#xff1a; 首先简单描述下SVG: SVG 意为可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff09;。 SVG 使用 XML 格式定义图像。 给界面或者按钮上显示一个图标或背景图片&#xff0c;日常使用.png格式的文件完全够用&#xff0c;但是有些使用场景需要把图…