【问题标题】:Writing a cached function in Racket在 Racket 中编写缓存函数
【发布时间】:2011-12-26 17:47:44
【问题描述】:

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

编写一个函数cached-assoc,它接受一个列表xs 和一个数字n,并返回一个函数,该函数接受一个参数v,并返回与(assoc v xs) 将返回的相同的东西。

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

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

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

我不知道该怎么做。

【问题讨论】:

  • 你有什么特别不知道的?或者,也许,你有什么想法怎么做?当然,你必须知道一些东西,否则你会遇到更大的问题。

标签: functional-programming lisp scheme racket memoization


【解决方案1】:

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

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

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

确实有这些问题,或者是其他什么让你卡住了?

【讨论】:

    【解决方案2】:

    这是我的实现。这只是为了让您了解如何解决这个问题;我写它的方式可能不会通过家庭作业提交(不是我假设那是你的意图)。 :-)

    (define (cached-assoc xs n)
      (define cache (make-vector n #f))
      (define index 0)
      (define (fetch-cache k i)
        (if (or (negative? i) (< i (- index n))) #f
            (let ((cur (vector-ref cache (modulo i n))))
              (if (equal? (car cur) k) cur
                  (fetch-cache k (sub1 i))))))
      (define (update-cache val)
        (vector-set! cache (modulo index n) val)
        (set! index (add1 index))
        val)
      (lambda (k)
        (cond ((fetch-cache k (sub1 index)))
              ((assoc k xs) => update-cache)
              (else #f))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-22
      • 2019-11-18
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多