【问题标题】:Racket Scheme - Removing Duplicate Consecutive Characters from Stream球拍方案 - 从流中删除重复的连续字符
【发布时间】:2016-12-04 11:29:52
【问题描述】:

我正在尝试实现一个从给定流中递归删除所有额外空格的函数。应删除任何连续的空格,在单词之间留出一个最大空格。我无法弄清楚如何正确实现这一点。

我已经尝试将流转换为列表并以这种方式进行操作,但我根本无法根据我对每个元素的测试提供的内容,弄清楚如何构造一个新流并返回它。我曾尝试使用流映射,但在这种情况下它似乎对我不起作用(删除元素,构建新流)

这是我当前对 remove-extra-spaces 的错误实现:

    (define remove-extra-spaces
  (lambda (str)
    (cond (not (not-more-than-one-space str 0) (stream-append (stream-first str) (remove-extra-spaces (stream-rest str))))
          (else (remove-extra-spaces (stream-rest str)))
          )))


    (define not-more-than-one-space
  (lambda (str count)
      (cond ((stream-empty? str) #T)
            ((equal? (stream-first str) #\space) (not-more-than-one-space (stream-rest str) (+ count 1)))
            ((> count 1) #F)
            (else #T)
            )
    ))

我写了一个测试来帮助我找出何时有多个连续的空格。但是,我无法弄清楚如何使用这个测试来创建一个基于通过它的新流。当我尝试将 Stream-filter 与 stream-map 结合使用时,它对我不起作用。

【问题讨论】:

    标签: scheme lisp racket


    【解决方案1】:

    你知道如何使用stream-cons吗?这可能是实现这一点的最简单方法。这是我的实现(使用SRFI 41 流库而不是racket/stream,因为我更熟悉它):

    (require srfi/41)
    (define-stream (collapse-spaces strm)
      (stream-let loop ((was-space #f)
                        (strm strm))
        (cond ((stream-null? strm) strm)
              ((char=? (stream-car strm) #\space)
               (if was-space
                   (loop #t (stream-cdr strm))
                   (stream-cons #\space (loop #t (stream-cdr strm)))))
              (else (stream-cons (stream-car strm)
                                 (loop #f (stream-cdr strm)))))))
    

    示例运行:

    > (stream->list (collapse-spaces (stream #\f #\o #\o #\space #\space #\b #\a #\r)))
    (#\f #\o #\o #\space #\b #\a #\r)
    

    【讨论】:

    • 谢谢。我将研究使用流利弊。我将它应用到我的 remove-extra-spaces 函数中,但是当我尝试再次将其转换为列表时出现错误。我用 stream-cons 替换了 stream-append。错误是:流优先:预期违反合同:(和/c流?(不是/c流空?))给定:#
    • 我是否应该使用某种内部递归(也许使用 letrec)来代替执行此任务?我正在尝试了解您的实现,因此我也可以自己完成。
    • 尝试编写一个在列表而不是流上运行的版本。也就是说,您的函数应该使用一个列表,并生成一个带有折叠空格的列表。如果你能写成功,流版本很容易转换成。
    • 我最初似乎应该将其视为列表问题。您的建议非常有帮助 - 我让它在列表实现中工作。我将只使用 stream->list 并以这种方式处理数据。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 2017-04-03
    • 2015-01-26
    • 2019-11-29
    相关资源
    最近更新 更多