Scheme - 如何查找两个流的交集

时间:2014-03-24 01:54:40

标签: stream scheme racket

有没有办法将流定义为两个流的交集?即,如果a和b是流,则c是包含a和b中的元素的流。

1 个答案:

答案 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))))))))