Racket博士:使用抽象列表函数从列表中删除元素

时间:2015-07-25 20:03:46

标签: list scheme racket

因此,当给出两个列表时,如何仅使用map,filter或foldr从一个列表中删除元素?我也不能使用显式递归或lambda。

列表仅包含按升序排序的数字。

例如,如果给定(列表1 2 3)和(列表1 3 5),我想从第一个列表中删除所有第二个列表的元素。我想要的输出是(列表2)。 如果给出(列表4 5 6)和(列表2 3 5),我会得到(列表4 6)。

我猜最终的代码是这样的:

(define (fn-name list-one list-two)
    (filter ... list-one))

谢谢!

2 个答案:

答案 0 :(得分:1)

鉴于您正在使用Racket,我们可以根据一些内置的抽象列表函数编写一个简单的解决方案,而不使用显式的lambda,我们只需要{{3}的一些帮助}}。试试这个:

(require srfi/26)

(define (difference lst1 lst2)
  (filter-not (cut member <> lst2) lst1))

按预期工作:

(difference (list 1 2 3) (list 1 3 5))
=> '(2)

(difference (list 4 5 6) (list 2 3 5))
=> '(4 6)

答案 1 :(得分:0)

您使用过滤器,但是您必须咖喱并反转member,以便在没有lambda的情况下无法执行此操作。

(define (remove-elements needles haystack)
  (filter (lambda (x) (not (member ...))) 
          haystack))


(define (remove-elements needles haystack)
  (define (not-in-needles x)
    (not (member ...)))

  (filter not-in-needles haystack))

这两个都使用lambda两次!一次为define remove-elements,一次为显式/ not-in-needles。在您自己的示例中,您也会使用lambda,因为(define (name . args) . body)(define name (lambda args . body))相同