-3

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

4

3 回答 3

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)
于 2013-10-21T22:11:56.473 回答
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))
于 2013-10-22T12:05:55.703 回答
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))))))
于 2013-10-22T20:39:48.280 回答