使用两个参数定义递归函数DELETE:原子A和列表L,它返回一个新列表,其中列表L的第一级上所有出现的原子A都已被删除。
示例:(Delete ‘a ‘(m a (m a)))
返回(m (m a))
。
答案 0 :(得分:0)
我会回答正文中提出的问题,这比你在标题中写的更难和不同。最简单的解决方案是使用其中一个内置程序 - 例如,如果您的翻译提供remove*
,它就可以解决问题。这是推荐的方法,避免重新发明轮子:
(remove* '(a) '(m a (m a) a))
=> '(m (m a))
但我想你想从头开始实现这个。该解决方案紧跟标准模板,用于遍历输入列表并返回输出列表。我会给你一些提示,但我不会破坏找到你自己答案的乐趣。填写空白:
(define (delete ele lst)
(cond (<???> ; if the list is empty
<???>) ; then return the empty list
(<???> ; is current element equal to `ele`?
(delete ele <???>)) ; then skip it and advance recursion
(else ; otherwise
(cons <???> ; `cons` current element
(delete ele <???>))))) ; and also advance recursion
按预期工作:
(delete 'a '(m a (m a) a))
=> '(m (m a))
作为旁注,调整代码以回答标题中的问题应该很简单:只要找到第一个元素,跳过它并返回列表的其余部分,它赢了没有必要进一步推进递归。留给读者练习。