首页 > 解决方案 > 如何删除球拍第二个列表中的所有元素?

问题描述

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

这个函数应该返回一个列表(包),其中每个元素出现在第一个包中的次数,减去它在第二个包中出现的次数(但绝不少于 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)

标签: listschemeracketbag

解决方案


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

你的前两种情况很好:

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

但实际上只剩下一种情况——两个列表都不是空的——条件是

    [else

在这里你想要

  1. 删除所有出现的(car L2)fromL1
  2. 产生该列表和(cdr L2)

这是

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

推荐阅读