list - 如何删除球拍第二个列表中的所有元素?
问题描述
例如,如果第一个包有'(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)
解决方案
请注意,您的递归 ,(difference L1 (cdr L2))
是最后一个条件。
你永远不会达到它,因为前面的条件涵盖了所有可能的情况——这两个条件是互斥的,所以其中一个条件必须为真(null? L2)
。(not (null? L2))
此外,它没有相应的结果,但您不会注意到,因为您从未达到它。
你的前两种情况很好:
(define (difference L1 L2)
(cond
[(null? L1) '()]
[(null? L2) L1]
但实际上只剩下一种情况——两个列表都不是空的——条件是
[else
在这里你想要
- 删除所有出现的
(car L2)
fromL1
- 产生该列表和
(cdr L2)
这是
(difference (remove (car L2) L1) (cdr L2))
推荐阅读
- ios - 在应用程序中添加评分和评论功能
- php - Codeigniter3 在服务器部署后给出 404(不读取应用程序文件夹)
- javascript - FabricJS:大画布导致对象在下部画布上呈现,但浏览器屏幕上没有对象出现
- regex - Apache .htaccess 重写规则两个条件?
- angular - 阅读 Angular 4 应用程序 oninit 方法上的 httpRequest
- c# - EF Core 一对多包括
- javascript - 如何设置/删除使用 angularjs 在浏览器中打开的 locastorage 特定 url(路由)?
- deep-learning - 分离 Pytorch 中关于部分损失的中间模块
- javascript - 在 React 中使用添加按钮添加输入
- scala - Alpakka S3Client 抛出 OptionVal$.contains NoSuchMethodError