删除流中的重复项(Scheme)

时间:2015-04-23 12:16:46

标签: stream scheme r5rs

我试图在方案R5RS中删除我的流中的重复项。这是我的代码。

(define (remove-duplicates lst)
  (cond ((stream-null?? lst) stream-null?)
        ((not (memq (stream-car lst) (stream-cdr lst)))
         (cons-stream (stream-car lst) (remove-duplicates (stream-cdr lst))))
        (else (remove-duplicates (stream-cdr lst)))))

(define (memq item x)
  (cond ((stream-null?? x) #f)
        ((eq? item (stream-car x)) x)
        (else (memq item (stream-cdr x)))))

我无法理解为什么这不起作用。任何解决方案或帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

"没有工作"是一个非常模糊的问题描述,但无论如何我都会尝试回答。

stream-filter并不是懒惰的,即使是这样,你也无法以相对明显的理由测试无限流中的成员身份。

为了让流保持懒惰,您无法通过查看"转发",仅#34;向后"来决定是否应该包含项目。 - 未来是隐藏的,你只能根据过去作出决定。

你需要解决问题 - 而不是过滤掉除了最后一个之外的所有实例,你保留第一个并过滤掉其余的实例,如果当你最终到达那里时结果存在。
(在无休止的流程中,一旦找到它就很容易删除,但是不可能发现某些东西不存在。)

(define (remove-duplicates lst) (if (stream-null? lst) stream-null (stream-cons (stream-car lst) (remove-duplicates (stream-filter (lambda(x) (not (eq? x (stream-car lst)))) (stream-cdr lst)))))) 对过滤很有用,结果可能如下所示:

{{1}}