我在计划中写一个自动回忆录时遇到了几个问题.
我有一个工作回忆器函数,它创建一个哈希表并检查该值是否已经计算过。如果在此之前已经计算过,则返回调用函数的值。
(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)))))))
现在,我想创建这样一个回忆录包装函数:
(define (memoize-wrapper function)
(set! function (memoizer function)))
并希望创建一个名为def-memo的宏,它用回忆录包装器定义函数。例如:宏可以扩展到(回忆录(定义函数名参数体.)或者类似的东西。
这样我才能做到:
(def-memo (factorial n)
(cond
((= n 1) 1)
(else (* n (factorial (- n 1))))))
它应该创建一个因子的回忆录版本,而不是普通的缓慢版本。
我的问题是
非常感谢。
发布于 2009-06-30 22:45:37
这就是我在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)
https://stackoverflow.com/questions/1066414
复制相似问题