从lisp中的整数列表中消除x的每次出现

时间:2013-10-21 22:09:56

标签: function lisp common-lisp

我需要编写一个lisp函数来消除整数列表中每次出现的x。例如,(elim 7'(7 6 8 8 7 7 9 0))返回(6 8 8 9 0)

3 个答案:

答案 0 :(得分:7)

你不需要写它;它已经为你写了,它被称为remove

CL-USER> (remove 7 '(7 6 8 8 7 7 9 0))
;=> (6 8 8 9 0)

如果您确实需要将其称为elim,则可以使用(setf fdefinition)

CL-USER> (setf (fdefinition 'elim) (fdefinition 'remove))
;=> ...
CL-USER> (elim 7 '(7 6 8 8 7 7 9 0))
;=> (6 8 8 9 0)

答案 1 :(得分:1)

假设你真的需要写它,通常的方法适用:

<强>递归

(defun elim (value list)
  (if list
    (let ((c (car list)))
      (if (= c value)
        (elim value (cdr list))
        (cons c (elim value (cdr list)))))
    (reverse list)))

尾递归

(defun elim (value list)
  (labels ((sub (list res)
             (if list
               (let ((c (car list)))
                 (if (= c value)
                   (sub (cdr list) res)
                   (sub (cdr list) (cons c res))))
               (reverse res))))
    (sub list '())))

<强>环

(defun elim (value list)
  (loop for i in list
    unless (= i value)
    collect i))

答案 2 :(得分:0)

递减列表,直到列表为空。如果列表的头部等于提供的项目,则不在输出中包含它:

(defun elim (value list)
  (if (null list)
      '()
      (let ((next (car list))
            (rest (cdr list)))
        (if (= value next)
            (elim value rest)
            (cons next (elim value rest))))))