Из SICP:
Это бесконечный поток единиц:
(define ones (cons-stream 1 ones))
Это бесконечный поток положительных целых чисел:
; add-streams takes two streams and produces a stream of their elementwise sum
(define integers (cons-stream 1 (add-streams ones integers)))
interleave
принимает элементы поочередно из двух потоков и возвращает результат
(define (interleave s1 s2)
(if (stream-null? s1)
s2
(cons-stream
(stream-car s1)
(interleave s2 (stream-cdr s1)))))
Следующая pairs
процедура принимает два потока s
и t
и производит все пары (s_i, t_j)
, такие что i <= j
.
(define (pairs s t)
(cons-stream
(list (stream-car s) (stream-car t))
(interleave
(stream-map (lambda (x)
(list (stream-car s) x))
(stream-cdr t))
(pairs (stream-cdr s) (stream-cdr t)))))
So
(pairs integers integers)
производит все пары целых чисел i
и j
с i <= j
.
Вот упражнение 3.67:
Упражнение 3.67. Измените процедуру
pairs
так, чтобы(pairs integers
integers)
создавал поток всех пар целых чисел(i, j)
(без условия(i <= j)
). Подсказка: вам нужно будет добавить дополнительный поток.
Мое решение:
(define (pairs2 s t)
(cons-stream
(list (stream-car s) (stream-car t))
(interleave
(stream-map (lambda (x)
(list (stream-car s) x))
(stream-cdr t))
(pairs2 (stream-cdr s) t))))
Итак, я просто изменил (stream-cdr t)
на t
в последнем рекурсивном вызове. Похоже, это дает все пары целых чисел.
Чего я не понимаю, так это утверждения:
Подсказка: вам нужно будет добавить дополнительный поток.
Что это значит? Мое решение неверно? Что они имеют в виду, когда говорят о дополнительном потоке?
Используя мою модифицированную процедуру pairs2
, это первые 20 результатов:
> (define p2 (pairs2 integers integers))
> (stream-ref p2 0)
(1 1)
> (stream-ref p2 1)
(1 2)
> (stream-ref p2 2)
(2 1)
> (stream-ref p2 3)
(1 3)
> (stream-ref p2 4)
(2 2)
> (stream-ref p2 5)
(1 4)
> (stream-ref p2 6)
(3 1)
> (stream-ref p2 7)
(1 5)
> (stream-ref p2 8)
(2 3)
> (stream-ref p2 9)
(1 6)
> (stream-ref p2 10)
(3 2)
> (stream-ref p2 11)
(1 7)
> (stream-ref p2 12)
(2 4)
> (stream-ref p2 13)
(1 8)
> (stream-ref p2 14)
(4 1)
> (stream-ref p2 15)
(1 9)
> (stream-ref p2 16)
(2 5)
> (stream-ref p2 17)
(1 10)
> (stream-ref p2 18)
(3 3)
> (stream-ref p2 19)
(1 11)
s
в левый столбец сверху вниз и элементыt
в верхнюю строку слева направо, а затем заполняя квадраты. 19.03.2019stream-interleave
. Спасибо, что поделился. 20.03.2019