你沒有說如果你想要remove
功能或delete
功能。我會在這裏做非破壞性的版本。
您可以製作一個列表的remove-nth
,方法是在索引之前創建所有元素的新列表,然後使用要刪除的cons
的尾部以共享盡可能多的結構。這是一個使用subseq
,nconc
和nthcdr
的實現來展示它是多麼容易,沒有遞歸。
(defun remove-nth (n list)
(nconc (subseq list 0 n) (nthcdr (1+ n) list)))
(defparameter *test* (list 0 1 2 3 4 5 6))
(remove-nth 3 *test*) ; ==> (0 1 2 4 5 6)
(remove-nth 0 *test*) ; ==> (1 2 3 4 5 6)
遞歸函數會是這個樣子:
(defun remove-nth-rec (n list)
(assert (not (null list)))
(if (zerop <??>)
<??>
(cons <??> (remove-nth-rec <??> <??>))))
可以使功能,這是否對每個子表遞歸了。我會用mapcar
做到這一點:
(defun remove-all-nth (n lol)
(mapcar (lambda (x) (remove-nth n x)) lol))
(remove-all-nth 0 '((a b c) (0 1 2) (I II III))) ; ==> ((b c) (1 2) (II III))
遞歸函數會是這個樣子:
(defun remove-all-nth-rec (n list)
(if (null <??>)
nil
(cons (remove-nth-rec n <??>)
(remove-all-nth-rec n <??>))))