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

时间:2011-06-10 13:59:13

标签: 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)))))

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

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

2 个答案:

答案 0 :(得分:7)

让我们这样想:

太生成无限的整数流,我们想做

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

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

(+1 +2 +3 +4 +5 ...)

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

(+1 -2 -3 -4 -5 ...)

让我们为第三名和以下人员做同样的事情:

(+1 -2 +3 +4 +5 ...)

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

(+1 -2 +3 -4 -5 ...)
(+1 -2 +3 -4 +5 ...)

正如我们所看到的,如果在每个元素之后我们添加整数流的其余部分,在反转它的符号(反转流的其余部分的符号)之后,我们将得到你想要的 - 一个整数流交替的迹象。每次我们在流的其余部分使用stream-map-来反转它的符号,其中“流的其余部分”只是从(+ n 1)开始的流。

cons-stream包裹它,你应该拥有它。

答案 1 :(得分:1)

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

正在做两件事,首先是cons-streamn和评估(stream-map - (integers-starting-from (+ n 1)))的值格式,它恰好是流的反转,作为-的monadic案例是否定的。因此,你的交替模式。

从功能名称出现,您正在寻找更像这样的东西

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