【问题标题】:Remove duplicates in streams (Scheme)删除流中的重复项(方案)
【发布时间】:2015-04-23 12:16:45
【问题描述】:

我正在尝试在方案 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)))))

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

【问题讨论】:

    标签: stream scheme r5rs


    【解决方案1】:

    “不起作用”是一个非常模糊的问题描述,但我还是会尝试回答。

    memq 并不懒惰,即使是这样,由于相对明显的原因,您也无法测试无限流中的成员资格。

    为了让流保持懒惰,您无法通过“向前”查看来决定是否应包含某个项目,只能通过“向后”查看 - 未来对您来说是隐藏的,您只能根据过去做出决定。

    您需要扭转问题 - 不是过滤掉除最后一个之外的所有实例,而是保留第一个并过滤掉其余实例,如果当您最终到达那里时任何结果都存在。
    (在源源不断的流中,一旦找到东西就很容易删除,但不可能发现不存在的东西。)

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

    【讨论】:

    • 感谢您的解释和解决方案。我终于明白了!
    猜你喜欢
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多