我试图在方案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)))))
我无法理解为什么这不起作用。任何解决方案或帮助将不胜感激。
答案 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}}