使用流生成带有交替符号的数字的更好解释

yan*_*-qu 5 scheme sicp mit-scheme

这里的代码可以生成这样的数字[1 -2 3 -4 5 -6 7 -8 9 -10 ...]

(define (integers-starting-from n)
  (cons-stream n (stream-map - (integers-starting-from (+ n 1)))))
Run Code Online (Sandbox Code Playgroud)

我不太了解它产生交替标志的方式.有人可以给我一个更好的描述来帮助我想象这个吗?

您可以在mit-scheme中运行代码.

Bar*_*kin 7

让我们这样想:

我们想做的就是产生无限的整数流

(define (integers-starting-from n)
  (cons-stream n (integers-starting-from (+ n 1))))
Run Code Online (Sandbox Code Playgroud)

这就像这样(从n = 1开始):

(+1 +2 +3 +4 +5 ...)
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设我们从第二位获取所有元素,然后反转它们的符号:

(+1 -2 -3 -4 -5 ...)
Run Code Online (Sandbox Code Playgroud)

让我们对第三个地方做同样的事情:

(+1 -2 +3 +4 +5 ...)
Run Code Online (Sandbox Code Playgroud)

重复两次,每次从下一个地方开始:

(+1 -2 +3 -4 -5 ...)
(+1 -2 +3 -4 +5 ...)
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,如果在每个元素之后我们添加整数流的其余部分,在反转它的符号(反转流的其余部分的符号)之后,我们将得到您想要的 - 具有交替符号的整数流.我们每次使用的时间stream-map-上清溪其余反转它的标志,其中"流的其余部分"是刚刚从开始流(+ n 1).

把它包起来,cons-stream你应该拥有它.