有没有办法将流定义为两个流的交集?即,如果a和b是流,则c是包含a和b中的元素的流。
答案 0 :(得分:2)
只要它们被排序(即使它们是无限的!),两个流可以相交。当然,如果它们是无限的并且没有排序,则无法知道元素是否在流中。但如果它们被排序,我们可以在任一流上前进(取决于元素的顺序),直到我们找到一个共同的元素,然后将其添加到输出中。
以下是使用Racket流基元的概念证明,并假设有两个数字流作为输入:
(define (stream-intersection s1 s2)
(if (or (stream-empty? s1) (stream-empty? s2))
(stream)
(let ((x1 (stream-first s1))
(x2 (stream-first s2)))
(cond ((> x1 x2)
(stream-intersection s1 (stream-rest s2)))
((< x1 x2)
(stream-intersection (stream-rest s1) s2))
(else
(stream-cons x1
(stream-intersection (stream-rest s1)
(stream-rest s2))))))))