如何从列表中删除给定的符号?

时间:2013-04-30 20:14:38

标签: functional-programming scheme

我正在尝试从列表中删除给定的符号。

这是我写的代码:

(define member?
  (lambda (in-sym in-seq)
    (if (and (symbol? in-sym) (sequence? in-seq))
        (if (null? in-seq)
            '()
            (append 
             (if (equal? in-sym (car in-seq)) '() (list (car in-seq))) 
             (member? in-sym (cdr in-seq)))))))

事实证明,我删除了给定符号的所有出现,尽管我只想删除第一次出现。有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

您可以使用内置程序,检查您的口译员是否提供remove

(remove 'b '(a b b c b))
=> '(a b c b)

现在,如果您打算自己实现这些功能,我建议您将问题分成两部分:一个程序检查程序是否可以执行(如果inSymbol是一个符号而{{1} }是一个序列),另一个是执行实际数据删除的inSeq

remove-member

答案 1 :(得分:2)

您的问题是您是否附加( member? inSym ( cdr inSeq))是否找到了该符号。你想要做的是:

(define member?
  (lambda (inSym inSeq)
    (if (and (symbol? inSym) (sequence? inSeq))
        (if (null? inSeq) '()
          (if (equal? inSym (car inSeq)) (cdr inSeq)
            (append (list (car inSec)) (member?  inSym (cdr inSeq)))
            )
          )
      )
    )
  )

即。如果你找到了符号,只需返回(cdr inSeq),因为你已经完成了。