【问题标题】:Scheme -- how to find the intersection of two streamsScheme——如何找到两个流的交集
【发布时间】:2014-05-01 05:49:43
【问题描述】:

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

【问题讨论】:

  • 流是无限的吗?他们排序了吗?你都尝试了些什么?请张贴您编写的代码作为问题的一部分
  • 不要越过溪流!
  • 您也可以尝试比较列表并将它们视为集合。然后制作一个交集函数。试试stream->list

标签: stream scheme racket


【解决方案1】:

两个流只要经过排序就可以相交(即使它们是无限的!)。当然,如果它们是无限的且未排序,则无法知道元素是否在流中。但是,如果它们已排序,我们可以在任一流上前进(取决于元素的顺序),直到找到共同的元素,然后将其添加到输出中。

这是一个使用 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))))))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多