删除流中的重复项(方案)
Remove duplicates in streams (Scheme)
我正在尝试删除方案 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)))))
我不明白为什么这不起作用。任何解决方案或帮助将不胜感激。
"Doesn't work"问题描述的很模糊,不过我还是尽量回答一下。
memq
不是懒惰,即使是懒惰,您也不能因为相对明显的原因测试无限流中的成员资格。
为了保持流的惰性,您不能通过查看 "forwards" 来决定是否应该包含一个项目,只能 "backwards" - 未来对您是隐藏的,您只能根据自己的决定关于过去。
您需要扭转问题 - 不是过滤掉除最后一个以外的所有实例,而是保留第一个并过滤掉其余实例,如果任何结果都存在你终于到了那里。
(层出不穷,找到东西很容易去掉,但是发现不存在的东西是不可能的。)
stream-filter
用于过滤,结果可能如下所示:
(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))))))
我正在尝试删除方案 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)))))
我不明白为什么这不起作用。任何解决方案或帮助将不胜感激。
"Doesn't work"问题描述的很模糊,不过我还是尽量回答一下。
memq
不是懒惰,即使是懒惰,您也不能因为相对明显的原因测试无限流中的成员资格。
为了保持流的惰性,您不能通过查看 "forwards" 来决定是否应该包含一个项目,只能 "backwards" - 未来对您是隐藏的,您只能根据自己的决定关于过去。
您需要扭转问题 - 不是过滤掉除最后一个以外的所有实例,而是保留第一个并过滤掉其余实例,如果任何结果都存在你终于到了那里。
(层出不穷,找到东西很容易去掉,但是发现不存在的东西是不可能的。)
stream-filter
用于过滤,结果可能如下所示:
(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))))))