SICP第3.5.2章无限流整数定义

问题描述 投票:2回答:3

我正在阅读SICP,并且难以理解为无限流提供的一个示例:

https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5.2

我们可以通过使用诸如add-streams之类的操作来操纵流来做更多有趣的事情,这会产生两个给定流的元素求和:62

(define (add-streams s1 s2)
  (stream-map + s1 s2))

现在我们可以如下定义整数:

(define integers (cons-stream 1 (add-streams ones integers)))

我显然可以理解integers定义背后的意图,但我正在努力在自己的脑海中“模拟”此流。先前的示例不是问题,因为状态的维护是明确的。如本例所示:

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))

(define integers (integers-starting-from 1))

我毫无疑问地理解了整数的定义。

本书描述了ones的定义:

(define ones (cons-stream 1 ones))

这很像递归过程的定义:一对是其对数为1的对,其cdr是对一个对进行评估的保证。评估cdr会再次给我们一个1和一个承诺来评估它,依此类推。

也许这条线让我失望了。一个很简单,因为在每个stream-cdr上都会评估该过程,并提供一个新的“ 1”和下一个承诺。

[当我尝试将此推理应用于integers时,我一直在努力理解为什么结果流不是“ 1 2 2 2 2 2 ... ...”的原因,因为整数会不断被重新评估,并且实际上从1重新开始。>

我正在阅读SICP,并且难以理解为无限流提供的一个示例:https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-ZH-24.html# %_sec_3.5.2我们...

stream scheme infinite sicp lazy-sequences
3个回答
0
投票

请参见foot note 56


0
投票

我在这里缺少的部分是integers根本没有被重新评估。add-streams返回的保证是每个输入流的stream-cdr。先前提到的“状态”保持在反馈回路中。老实说,它的力量似乎仍然不可思议。


0
投票

每次在stream-cdr上调用integers时,都会创建一个新的ones系列,并将其添加到所有先前的ones中。

© www.soinside.com 2019 - 2024. All rights reserved.