删除列表第一级的元素

时间:2014-10-13 10:20:30

标签: scheme

使用两个参数定义递归函数DELETE:原子A和列表L,它返回一个新列表,其中列表L的第一级上所有出现的原子A都已被删除。

示例:(Delete ‘a ‘(m a (m a)))返回(m (m a))

1 个答案:

答案 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))

作为旁注,调整代码以回答标题中的问题应该很简单:只要找到第一个元素,跳过它并返回列表的其余部分,它赢了没有必要进一步推进递归。留给读者练习。