【问题标题】:Scheme remove a list方案删除列表
【发布时间】:2011-12-02 16:55:24
【问题描述】:

我发现这个帖子的内容非常有用! How to delete an element from a list in scheme

我测试了推荐的代码,它似乎在列表中第一次也是唯一一次出现时删除了一个项目。

说我想要列表中所有出现的项目。或者更进一步,如果我想指定项目列表而不是要删除的项目。

例如,如果我有一个名为 removelist 的函数,它接受两个列表作为参数

(define (removelist L M))

> (removelist '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2))
> '(3 4 5 5 6 7 8 9)

希望这是有道理的。

【问题讨论】:

  • (removelist '(1 2 1 2 1 3 4 5) '(1 2 1)) 的结果是什么?
  • 结果将是'(3 4 5)。基本上,它是从列表 L 中删除列表 M 中所有出现的项目。

标签: list filter scheme


【解决方案1】:

这里有一个简单的函数,它使用filtermember 来完成这个:

(define (remove-list l m)
 (filter (lambda (element)
          (not (member element m)))
  l))

结果如下:

> (remove-list '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2))
  (3 4 5 5 6 7 8 9)
> (remove-list '(1 2 2 3 4 5 2 2 5 6 7 8 9) '(1 2 1))
  (3 4 5 5 6 7 8 9)

此 sn-p 需要 srfi-1。希望这会有所帮助。

问候,
马特

【讨论】:

  • 这真的很有帮助!!非常感谢。过滤器和成员究竟是如何工作的?
  • 查看filtermember的文档。您可以查看srfi-1here 的其他功能。基本上,filter 返回与谓词匹配的每个元素(传递给它的 lambda 函数)。如果元素是列表的一部分,函数member 返回该元素,否则返回#f
  • 如果您正在寻找答案,请不要犹豫;)
  • 非常感谢您的帮助,但不幸的是,这并不是我正在寻找的答案。这是学校作业的一部分,不幸的是,我不允许使用 srfi-1 或任何东西。但是,如果我能弄清楚如何编写过滤器和成员来实现自己,我相信这正是我所需要的。 :)
  • 嗨,马特,再次感谢。在找到一些有关使用member 的文档后,我能够弄清楚这一点! :)
【解决方案2】:

使用简单的递归,不使用过滤器或成员等内置函数:

(define (filter_out m l)
  (cond ( (null? l) '() )
        ( (equal? (car l) m) (filter_out m (cdr l)) )
        ( else (cons (car l)  (filter_out m (cdr l))) )
        ))

测试:

(filter_out 'jay (list 'jay 'z 'jay 'dilla 'jay 'electro))
(filter_out '(jay z) (list '(jay z) '(jay dilla) 'jay '(electro)))

如果您有兴趣学习这种类型的编码,请查看“The Little Schemer”。只需要几个小时就可以读完,读完就成为递归高手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多