我需要编写一个 lisp 函数,从整数列表中消除 x 的每次出现。例如, (elim 7 '(7 6 8 8 7 7 9 0)) 返回 (6 8 8 9 0)
问问题
114 次
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 回答