因此,当给出两个列表时,如何仅使用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))
谢谢!
答案 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))
相同