为什么这个记忆器适用于递归函数?

2024-05-02

我不明白为什么下面的代码是这样的fib以线性而非指数时间运行。

def memoize(obj):
    """Memoization decorator from PythonDecoratorLibrary. Ignores
    **kwargs"""

    cache = obj.cache = {}

    @functools.wraps(obj)
    def memoizer(*args, **kwargs):
        if args not in cache:
            cache[args] = obj(*args, **kwargs)
        return cache[args]
    return memoizer

@memoize
def fib(n):
    return n if n in (0, 1) else fib(n-1) + fib(n-2)

例如,fib(100)并没有像我预期的那样完全爆炸。

我的理解是@memoize sets fib = memoize(fib)。所以当你打电话时fib(100), 看见那个100不在缓存中,它会调用obj on 100. But obj is the 原来的fib功能,那么(在第一次评估时)不应该像我们根本没有记忆一样花费那么长的时间吗?


obj装饰器中确实是包装的、未修改的、非记忆化的函数。但是,当所述函数尝试递归时,它会查找全局名称fib,获取记忆化的包装函数,因此也会导致第 99 个、第 98 个……斐波那契数一路被记忆。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个记忆器适用于递归函数? 的相关文章

随机推荐

  • Android编程-多个列表视图的onitemclicklistener不起作用

    在我的活动中 我创建了七个列表视图 并使用 viewpager 在同一活动中在它们之间滑动 然后我有一个 sqlite 数据库填充每个列表视图 我的问题是 onitemclicklistener 不起作用 没有错误 代码执行正常 但列表项点
  • 根据用户投票移动 div

    我是新来的 但我喜欢这个网站 我检查了其他类似的问题 但没有看到我要找的东西 我是一名音乐家 有一段时间我一直在做 每日之歌 每天写一首小歌 我想将歌曲发布为 div 在里面 li 在 div 中 我只想要一个简单的 mp3 播放器和一个
  • 如何根据某些条件跳过 MSSQL 游标中的一行(迭代)?

    如何根据某些条件在 MSSQL 游标中跳过一行 迭代 我有一个可迁移数千条记录的 DTS 并且根据某些条件 某些记录不需要迁移 因为它们是重复的并且想要跳过这些记录 知道如何在 MSSQL Cursor 中完成此操作吗 我想最简单的方法是在
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • ACTION_SEND 强制通过电子邮件发送

    每次我创建一个从应用程序发送电子邮件的操作时 它都会提示许多选项 包括 QR 客户端 有没有办法强制仅通过电子邮件客户端发送 发送电子邮件的代码 String rec owner email i new Intent Intent ACTI
  • 从 Android 应用程序调用 Google 地图应用程序以获取行车方向

    我需要使用外部谷歌地图应用程序显示行车方向我找到了这个链接http developer android com guide appendix g app intents html http developer android com gui
  • 为什么 CMake 没有检测到对我生成的文件的依赖关系?

    我正在尝试使用自定义命令生成标头 每次重建时都应更新标头 以便包含它的源文件也将被重建 实际命令是一个脚本 但这里是一个简化版本 这是我的项目 CMakeLists txt cmake minimum required VERSION 2
  • Java 8 项目的 Maven 代码覆盖率

    我想为我的 Java 8 Maven 项目创建代码覆盖率报告 我在使用 Cobertura 时遇到问题 因为它无法处理 Java 8 语法 有人熟悉解决方法吗 还有其他 Maven 插件吗 Use JaCoCo http eclemma o
  • 命令调度程序和中介器设计模式有什么区别?

    最近 我了解了命令调度程序模式 它可以帮助将命令与我们基于域驱动设计方法和 CQRS 模式的项目中的命令处理程序解耦 不管怎样 我把它与中介者设计模式混淆了 罗伯特 哈维已经回答了 https softwareengineering sta
  • u-boot:搬迁

    这是一个与u boot相关的基本问题 为什么 u boot 代码会自行重新定位 好吧 如果 u boot 是从 NOR flash 或启动 ROM 空间执行 那么这是有道理的 但如果它已经从 SDRAM 运行 为什么它必须再次重新定位自己呢
  • 如何使用 Spring 状态机在状态转换期间引发异常

    我试图了解状态转换期间操作如何抛出异常 我配置了这个简单的状态机 transitions withExternal source State A1 target State A2 event Event E1 action executeA
  • 文件上传字段导致 ActionController::InvalidAuthenticityToken 异常

    使用 Rails 4 并尝试使用 simple form 和回形针将文件字段添加到现有表单 这是表格的关键部分 一切正常 除非我实际提交带有上传文件的表单 然后 我得到这个 ActionController InvalidAuthentic
  • Android 有类似 mechanize 这样的工具吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在创建一个 Android 应用程序 它必须在后台进行一些网上冲浪 以便为用户提供服务 我必须连接
  • 如何在Python中设置像素的alpha值

    我正在尝试编辑image https drive google com file d 0B8JcwRV HVk0OURrcTFJczhmV2RlUGdMOG0ybldYUVRoamtF view usp sharing以一种将所有白色像素转
  • 在 Ruby 中定义元编程的方法参数

    在 Ruby 中 我们可以使用元编程来定义实例方法 例如 define method hi Hello SO world gt hi hi gt Hello SO world 这样 就可以定义一个带有动态名称 dynamic name hi
  • GNU Make “Abort trap: 6” 在 gcc 调用之后,但是单独执行时调用是有效的

    我正在使用 GNU Make 构建一个很多人都会使用的 C C 项目 makefile 尝试通用 因为该项目中有许多可选文件 每个用户通过 MATLAB 界面选择这些文件 然后通过命令行参数 make target OPTS XYZ 等 将
  • SupportMapFragment 地图为空

    我使用以下代码在 Xamarin Android 中显示地图 private SupportMapFragment mapFragment private GoogleMap map protected override void OnCr
  • 为什么这个 Clojure 减速器 r/fold 没有提供任何性能优势?

    我想知道为什么下面的代码在 r fold 的情况下没有提供加速 我对减速器有什么误解吗 我在一个相当慢的 尽管有 2 个核心 Ubuntu 12 04 开发盒上运行它 通过 emacs 和 lein 运行 每个都有相同的结果 require
  • 为什么 pandas.melt 会弄乱我的数据类型?

    我有一些数据透视代码因错误而失败 pandas core base DataError 没有要聚合的数字类型 我已将问题追溯到之前的调用pandas melt https pandas pydata org pandas docs stab
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob