functional-programming - 在 Racket 中编写缓存函数

标签 functional-programming lisp scheme racket memoization

所以我正在编写一些代码(正在复习 Racket 类(class)的练习考试),我必须执行以下操作:

编写一个函数 cached-assoc 接受一个列表 xs 和一个数字 n 并返回一个接受一个参数的函数 v 并返回与 (assoc v xs) 相同的内容。

你应该使用最近结果的 n 元素缓存来使这个函数比仅仅调用 assoc 更快。缓存应该是一个长度为 n 的向量,它是通过调用 cached-assoc 创建的,并且在每次调用 cached-assoc 返回的函数时使用并可能发生变化。

缓存开始时为空(所有元素#f)。当调用 cached-assoc 返回的函数时,它首先检查缓存中的答案。如果不存在,它使用 assocxs 来获得答案,如果结果不是 #f(即 xs 有一个匹配的对),它在返回之前将该对添加到缓存中 (使用矢量集!)。

缓存槽以循环方式使用:第一次将一对添加到缓存时,将其放入位置 0,下一对放入位置 1,依此类推。到位置 n - 1,然后回到位置 0(替换已经存在的对),然后是位置 1,等等。

我不知道该怎么做。

最佳答案

这个问题需要你做一些事情。这是部分列表:

  1. 如何构建具有内部非全局状态的函数。
  2. 如何定义可以在向量中搜索项目的函数。
  3. 如何构造一个函数来包装另一个函数。
  4. 知道 assoc 做什么。
  5. 如何改变向量。
  6. 如何改变局部变量。

作为一个测验题,它实际上是一次练习几个概念,如果你不把这些概念放在心上,你就会有困难。

您是否遇到过这些问题,或者是否有其他问题让您陷入困境?

关于functional-programming - 在 Racket 中编写缓存函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089658/

相关文章:

javascript - 如何使用 Ramda 将数组数组转换为对象数组?

lisp - 简化和评估 LISP 中的表达式

编写惰性序列转换的 Swift 问题

lisp - 尖引号 (#') 与符号功能有何不同?

function - SBCL 时间函数返回什么?

functional-programming - 从列表中添加数字(例如 asdf125dkf 将返回 8)

scheme - 方案中的平台(OS)检测

scheme - 在 Racket 中对列表进行分区

functional-programming - SICP 练习 4.6 : Implementing let in the evaluator as a derived expression based on lambda

functional-programming - OCaml 访问者模式