如何删除球拍第二个列表中的所有元素?

How can I remove all the elements that are in the second list in racket?

例如,如果第一个包有'(a b a a),第二个包有'(a b c),它应该return '(a a)

这个函数应该 return 一个列表(包),其中每个元素出现的次数与它在第一个包中出现的次数减去它在第二个包中出现的次数(但绝不会少于 0次)。例如:

 (difference '(a a b a) '(b a a)) --->'(a)
 (difference '(a b c) '(a b a a)) --->'(c)
 (difference '(a b c) '(a b c)) --->'()
 (difference '() '(a b a a)) --->'()
 (difference '(a b a a) '())--->'(b a a a)

这是我的球拍:

(define (difference L1 L2)
  (cond
    [(null? L1) '()]
    [(null? L2) L1]
    [(equal? L1 L2)'()]
    [(not(null? L2))(remove (car L2) L1)]
    [(difference L1 (cdr L2))]
    ))

我的代码只会删除 L2 中的第一个元素。如何修复我的代码以删除 L2 中的所有元素?

我的输出:

 (difference '(a a b a) '(b a a)) --->'(a a a)
 (difference '(a b c) '(a b a a)) --->'(b c)
 (difference '(a b c) '(a b c)) --->'()
 (difference '() '(a b a a)) --->'()
 (difference '(a b a a) '())--->'(b a a a)

请注意,您的递归 (difference L1 (cdr L2)) 是最后一个 条件
你永远不会到达它,因为前面的条件涵盖了所有可能的情况——这两个条件 (null? L2)(not (null? L2)) 是互斥的,所以其中一个必须为真。 而且,它没有相应的结果,但你没有注意到,因为你永远达不到它。

你的前两个案例没问题:

(define (difference L1 L2)
  (cond
    [(null? L1) '()]
    [(null? L2) L1]

但是实际上只剩下一个案例了——两个列表都不为空——那个条件是

    [else

你想

  1. L1
  2. 中删除所有出现的 (car L2)
  3. 产生该列表与 (cdr L2)
  4. 之间的差异

也就是

(difference (remove (car L2) L1) (cdr L2))