Лучшее объяснение использования потока для генерации чисел с чередующимися знаками - PullRequest
5 голосов
/ 10 июня 2011

Код здесь может генерировать числа, подобные этому [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)))))

Я не совсем понимаю, как он генерирует знаковые знаки. Может кто-нибудь дать мне лучшее описание, чтобы помочь мне это визуализировать?

Вы можете запустить код в мит-схеме.

Ответы [ 2 ]

7 голосов
/ 10 июня 2011

Давайте подумаем об этом так:

Слишком большой поток целых чисел, мы бы хотели сделать

(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 голос
/ 10 июня 2011
(cons-stream n (stream-map - (integers-starting-from (+ n 1)))))

делает две вещи, во-первых, это cons-stream значение n и форма значения, оценивающая (stream-map - (integers-starting-from (+ n 1))), которая оказывается инверсией потока, поскольку монадный случай - - отрицание. Таким образом, ваш чередующийся шаблон.

Из названия функции видно, что вы ищете что-то похожее на это

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