在Scheme中编写一个自动记忆器。有关宏和包装器的帮助

2024-03-18

我在Scheme中编写自动记忆器时遇到了一些问题。

我有一个有效的 memoize 函数,它创建一个哈希表并检查该值是否已经计算出来。如果之前已经计算过,则返回值,否则调用该函数。

(define (memoizer fun)
  (let ((a-table (make-hash)))
    (λ(n)
      (define false-if-fail (λ() #f))
      (let ((return-val (hash-ref a-table n false-if-fail)))
        (if return-val
            return-val
            (begin
              (hash-set! a-table n (fun n))
              (hash-ref a-table n)))))))

现在我想创建一个像这样的 memoize-wrapper 函数:

(define (memoize-wrapper function)
  (set! function (memoizer function)))

希望创建一个名为 def-memo 的宏,它用 memoize-wrapper 定义函数。例如。宏可以扩展为 (memoizer (define function-name argument body ...) 或类似的东西。

这样我应该能够做到:

(def-memo (factorial n)
  (cond
    ((= n 1) 1)
    (else (* n (factorial (- n 1))))))

这应该创建阶乘的记忆版本,而不是正常的慢速版本。

我的问题是

  1. memoize-wrapper 无法正常工作,它没有调用 memoized 函数,而是调用原始函数。
  2. 我不知道如何在宏内部编写定义。如何确保可以获得可变长度参数和可变长度主体?然后我如何定义该函数并用记忆器将其包装起来?

多谢。


这是我在 PLT 方案中使用的:

#lang scheme

(define (memo f)
  (define mh (make-hash))
  (lambda p
    (hash-ref mh p (lambda ()
                     (hash-set! mh p (apply f p))
                     (hash-ref mh p)))))

(define-syntax-rule (defmemo (id . p) . body)
  (define id (memo (lambda p . body))))

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

在Scheme中编写一个自动记忆器。有关宏和包装器的帮助 的相关文章

  • Clojure 函数 - 返回最后一条语句之前计算的值

    我有一些用 Clojure 编写的测试 这是一个简单的例子 defn test1 start server run pvt and expect PVT 0 stop server 我想返回 run pvt and expect 的结果 但
  • 如何获取数组中每个数字的阶乘值?

    我试图使用此方法获取数组中每个项目的阶乘值 但这仅输出一个值 任何人都可以帮助我找出我做错的地方吗 function mathh arr fn for i 1 i lt sizeof arr i arr2 arr2 i fn arr i r
  • Kotlin 的不同类型的 reduce() 函数

    我正在查看数组扩展函数并发现reduce one inline fun
  • 使用参与者模型进行基于时间的模拟

    我们有一个单线程应用程序 可以模拟数十万个对象随着时间的推移与共享内存模型的交互 显然 它无法在多 CPU 硬件上进行扩展 在阅读了一些有关基于代理的建模和函数式编程 参与者模型的内容后 我正在考虑使用消息传递范例进行重写 这个想法非常简单
  • 计算 python 字典/数组数据结构的非空尾叶 - 递归算法?

    我正在寻找一个函数来查找一种复杂字典 数组结构的所有非空端点 我认为因为我不知道嵌套数组的数量或它们的位置 所以它必须是递归的 而我只是还没有完全理解这种思维方式 所以对于嵌套字典 x top middle nested value nes
  • 我应该选择哪种函数式编程语言作为第一种函数式编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我想学习一种函数式编程语言 以了解不同的编程范例 我的编程背景 Java 我刚刚通过了 SCJP 考试 一些 ruby 和非常有限的 Rails
  • 使用map或reduce或filter,在Scheme中,计算列表中有多少个元素[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 number length 1 1 0 1 0 0 这假设返回 6 我知道如何使用长度并找到它 但我不知道如何在没有长度的情况下使用映射或过
  • 如何在 Haskell 中获得列表的中间位置?

    我刚刚开始使用 Haskel 学习函数式编程 我正在慢慢度过Erik Meijer 在 Channel 9 的讲座 http channel9 msdn com shows Going Deep Lecture Series Erik Me
  • 函数式编程是否需要新的命名约定?

    我最近开始使用 Haskell 学习函数式编程 并在 Haskell 官方 wiki 上发现了这篇文章 如何阅读哈斯克尔 http www haskell org haskellwiki How to read Haskell What t
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • 方案中的多维向量?

    我之前问过一个关于方案中数组的问题 结果它们被称为向量 但在其他方面基本上与您期望的相同 有没有一种简单的方法可以在 PLT 方案中处理多维 arrays 向量 出于我的目的 我想要一个名为make multid vector或者其他的东西
  • 方案中的尾递归幂函数

    我在方案中编写尾递归幂函数时遇到问题 我想使用辅助函数来编写该函数 我知道我需要一个参数来保存累计值 但在那之后我就陷入了困境 我的代码如下 define pow tr a b define pow tr h result if b 0 r
  • Xcode 中定义的宏 CURRENT_PROJECT_VERSION 在哪里?

    这个帖子如何在 xcode 8 中设置 CURRENT PROJECT VERSION https stackoverflow com questions 39673280 how to set current project versio
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 什么样的函数被认为是“可组合的”?

    维基百科文章函数组合 计算机科学 https en wikipedia org wiki Function composition computer science says 就像数学中通常的函数组合一样 每个函数的结果作为下一个函数的参数
  • 如何在 VS Code 宏中将焦点返回到编辑器,将 Python 文本发送到调试控制台?

    我尝试按键绑定宏以将 python 文本发送到调试控制台并将焦点返回到 Visual Studio Code 中的编辑器 这是我尝试过的 安装了vscode python https marketplace visualstudio com
  • 学习 LISP 的最佳方法是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 如何让球拍不打印?

    我正在 Racket 中编写一个程序 我正在使用它运行racket foo rkt 这是可行的 除了程序顶层每个表达式的结果都会被打印 即使没有调用打印函数 就好像程序是逐行输入到 REPL 中的 但在这种情况下 我根本不尝试使用 REPL

随机推荐

  • Windows 登录集成

    我正在出于某种目的构建面部识别软件 但是 作为衍生产品 我想使用相同的软件 概念 当我坐在电脑前时自动识别我并登录 处理识别 但是 我需要将其合并到 Windows 中 就像指纹登录的工作方式一样 我可以去哪里获取有关执行此操作的更多信息
  • 使用 wicked_pdf 从生成的 PDF 生成 ZIP

    在我的发票系统中 我需要一个备份功能来一次性下载所有发票到一个 zip 文件中 该系统在 Heroku 上运行 因此只能临时保存 pdf 我安装了 ruby zip 和 wicked pdf gem 我当前在控制器中的代码 def zip
  • 垃圾收集线程太多

    我正在用java开发一个软件 它在接收到事件 来自传感器 时创建一个线程 这些线程的生存时间非常短 传感器发送最多 10 个事件 分钟 这个应用程序在大多数情况下都运行良好 但有时它会挂起 当查看 eclipse 调试器时 我发现有很多线程
  • 你怎么知道用 malloc() 分配多少空间?

    我是一个完全的 C 新手 我来自 C 我一直在学习内存管理和malloc 功能 我也遇到过这段代码 char a persons name malloc sizeof char 2 我不明白这是分配了多少空间a persons name 是
  • Excel更改条件格式公式

    我有一个表 其中包含许多代表时间线的单元格 每分钟一个单元格 宽度非常小 我想在该表中可视化包含三个阶段的操作 一条线上可以有多个手术 代表一个手术室 例如 如果准备工作在 10 00 开始 实际操作在 10 23 开始 则这些时间之间的所
  • 如何使用GVIM编辑远程文件?

    我在 Ubuntu 9 10 上使用 GVIM 我正在寻找正确的方法来配置 GVIM 以便能够通过 ftp 等方式编辑远程文件 HTML PHP CSS 当我使用 e scp username remotehost path to file
  • 将数据表导出到 Excel [重复]

    这个问题在这里已经有答案了 可能的重复 如何在C 中将DataTable导出到Excel https stackoverflow com questions 8207869 how to export datatable to excel
  • Mongoose 使用多个参数搜索 FindOne

    我第一次尝试使用 Angular Express mongodb 构建一些东西 所以我可能会以完全错误的方式进行处理 Express 用于提供 json 然后 Angular 会处理所有视图等 我正在使用 Mongoose 与 Mongo
  • Python运行系统命令然后退出...不会退出

    我有以下 python 代码 os system C Python27 python exe C GUI TestGUI py sys exit 0 它运行命令正常 并弹出一个窗口 但是 它不会退出第一个脚本 它就留在那里 我最终不得不强制
  • 如何使用带标签的 AWS Cli 过滤 Lambda?

    所以我知道我可以通过此命令以文本 csv 形式获取所有 lambda 函数 aws lambda list functions region us east 1 query Functions FunctionName output tex
  • 如何获取带视频 ID 的 YouTube 视频描述?

    我目前正在使用 youtube 的 Javascript API 在我的网页上显示视频 但是现在我还想从视频 ID 中检索 youtube 描述 我该怎么做呢 我只想要描述和标题 ex kind youtube video etag eta
  • 使用 Nom 5 解析带有转义引号的单引号字符串

    我是 Rust 和 Nom 的新手 我正在尝试解析可能包含转义引号的 单 引号字符串 例如 foo bar or x x or 我找到了escaped 宏 其文档 https docs rs nom 5 0 1 nom macro esca
  • LinkedList 为同一功能提供了多种方法 - 为什么? [复制]

    这个问题在这里已经有答案了 我正在检查Java util LinkedList类 发现Linked List类提供了几个方法 public void addFirst E e public boolean offerFirst E e pu
  • 通过单独的线程在表单上绘图

    我正在尝试构建一个多线程游戏 其中我有一个单独的线程用于在不是主线程的表单上进行绘画 这给我们带来了线程安全技术 我已经阅读了很多相关文章 但我不确定我是否正确理解了它 我的问题是我有一个结构 其中每个数据对象都在表单上自行绘制 所以我不知
  • 如何使用XHTML/HTML给网站添加站内搜索功能? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我真的很想学习如何为我的网站制作自己的搜索引擎 我有定义的按钮和标签 但它不搜索 我无法弄清楚用于实际搜索该网站的 HTML 或 XHTM
  • 杰克逊 FAIL_ON_UNKNOWN_PROPERTIES 为 false 不起作用

    我正在尝试使 jackason 的 thrift 反序列化向后兼容 ObjectMapper mapper getObjectMapper false pretty mapper configure DeserializationFeatu
  • 将opentok视频会议集成到parse.com + iOS应用程序中

    这个问题不仅针对代码 还针对我的应用程序设计 我有一个 iPhone 应用程序 需要 opentok 来处理视频 音频会话 我已经经历过基本样品 http www tokbox com opentok ios docs index html
  • 在 iOS 上禁用全屏自动播放

    我遇到的唯一问题是 根据苹果文档 我无法禁用全屏播放视频 这是默认启用的 需要设置如下 webView configuration allowsInlineMediaPlayback true 这是基于我的理解它应该是怎样的 然而 这不起作
  • 是否可以在 DOM 中移动

    我想创建一个
  • 在Scheme中编写一个自动记忆器。有关宏和包装器的帮助

    我在Scheme中编写自动记忆器时遇到了一些问题 我有一个有效的 memoize 函数 它创建一个哈希表并检查该值是否已经计算出来 如果之前已经计算过 则返回值 否则调用该函数 define memoizer fun let a table