lou*_*ear 6 scheme stream memoization sicp delayed-execution
计算机程序的结构和解释一书介绍了一个记忆过程如下:
(define (memo-proc proc)
(let ((already-run? false) (result false))
(lambda ()
(if (not already-run?)
(begin (set! result (proc))
(set! already-run? true)
result)
result))))
Run Code Online (Sandbox Code Playgroud)
在提出延迟执行的定义的同时,(delay <exp>)是(memo-proc (lambda () <exp>))。可以使用以下过程强制延迟对象:
(define (force delayed-object)
(delayed-object))
Run Code Online (Sandbox Code Playgroud)
在给出这些定义的章节中,计算是使用流完成的。每个流都是一对,有一个头部和一个延迟尾部。
但是,我不知道如何在不使用查找表或其他累积先前调用的数据结构的情况下实现记忆化。
包括这些定义的章节在这里。
当我们用各种参数记住单个过程时,查找表会很有用。然后,我们将参数作为键,将过程的结果作为值。在这种情况下,我们有空过程,因此我们不需要查找表。我们所需要的只是我们迄今为止创建的一组延迟对象。但是,这里使用了闭包。
根据memo-proc上面的定义,每个延迟对象实际上是一个带有值already-run?和的闭包result,它们都初始化为false。但是,由于调用中的每个延迟对象proc都有自己的闭包和自己的本地already-run?和result,因此修改它们不会更改调用树中的其他对象。因此,我觉得任何其他程序都不会再读取记忆值。
所以我的问题是,我在想什么,或者对一切如何运作的正确解释是什么?
每个延迟对象在第一次被强制后都会存储自己的值;该值存储在result变量中。它之所以有效,是因为在承诺(等待评估的无参数过程)和变量上memo-proc创建了一个闭包。procresult
第一次强制对象被result返回后,将不再重新计算存储的对象。因此,承诺就变成了价值本身。
我不明白如何在不使用查找表或累积先前调用的其他类型的数据结构的情况下实现记忆化。
数据结构是围绕每个 Promise 创建的闭包,它将第一次调用的值累积在变量中result,并为所有后续调用返回该值。
因此,我觉得记忆值不会再被任何其他程序读取
是的,每次force在 Promise 对象上调用时都会读取它。
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |