如何使一个函数成为它在球拍中的记忆版本 [英] How to make a function a memoized version of it in racket
本文介绍了如何使一个函数成为它在球拍中的记忆版本的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试定义一个以函数f作为参数的make-memoize函数。其想法是make-memoize将返回一个与mememization一起运行的过程f。在使用函数f作为参数定义make-Memoize之后,我已经能够返回一个过程。但是,我还不能实际应用该函数来加、减或乘一个数字。也就是说。如果我将make-Memoize和Add-One函数作为参数应用到28号,我应该会得到29作为结果。
这是我到目前为止得到的信息:
(define (make-memoize f)
(let ((memoized-values (make-hash)))
(lambda (n)
(if (hash-has-key? memoized-values n)
(hash-ref memoized-values n)
(f n)))))
当我使用函数Add-One to 28运行make-memoize时:
(make-memoize (add-one 28))
我得到的是:
> (make-memoize (slow-add-one 28))
#<procedure:...s/rack-folder/test-file.rkt:26:4>
它似乎向我抛出了过程及其目录?谢谢您的帮助。
推荐答案
我看到几个问题:
- 您不使用计算值更新哈希表
make-memoize
是从函数创建新函数的函数
所以正确的用法是这样的:
(define (add-one n)
(+ n 1))
(let ((fast-add-one (make-memoize add-one)))
(fast-add-one 1)
(fast-add-one 1)
(fast-add-one 1))
下面提供了完整的代码,可以从Racket IDE
执行:
(define (add-one n)
(+ n 1))
(define (make-memoize f)
(let ((memoized-values (make-hash)))
(lambda (n)
(if (hash-has-key? memoized-values n)
;; Get and return the value from hash-table
(let ((previous-value (hash-ref memoized-values n)))
(printf "READ VALUE ~A->~A~%" n previous-value)
previous-value)
;; Update the value in the hash table
(let ((new-value (f n)))
(printf "SET VALUE ~A->~A~%" n new-value)
(hash-set! memoized-values n new-value)
new-value)))))
(let ((fast-add-one (make-memoize add-one)))
(fast-add-one 1)
(fast-add-one 1)
(fast-add-one 1))
评估结果应如下所示:
SET VALUE 1->2 ;; Here, this is the first computation of add-one
READ VALUE 1->2 ;; Here, we just read from hash table
READ VALUE 1->2 ;; Here, we just read from hash table
编辑:您的错误问题的答案
> (make-memoize (slow-add-one 28))
#<procedure:...s/rack-folder/test-file.rkt:26:4>
这不是错误,Racket
解释器只是返回给定文件名/行中定义的procedure
(函数)。
在我提供的代码中,函数调用(make-memoize add-one))
还返回一个procedure
。
> (make-memoize add-one))
#<procedure>
这篇关于如何使一个函数成为它在球拍中的记忆版本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文