0

想学lisp,想每隔n个删一次。我只设法删除了第一个(第 n 个)元素

(defun delete-nth (n list)
(if (zerop n)
(cdr list)
(let ((cons (nthcdr (1- n) list)))
  (if cons
    (setf (cdr cons) (cddr cons))
    cons))))

我想删除下一个等

我也试过这个:

(defun remove-nth (list n)
(remove-if (constantly t) list :start n :end (+ 1 n)))

不知道如何重新开始

我在想的是连接,但我不知道如何跟踪我的位置。

4

3 回答 3

1

从 1 计数(更改为 0 是微不足道的):

(defun remove-every-nth (n list)
  (loop for element in list
        for index from 1
        unless (zerop (rem index n))
          collect element))

另外:请正确缩进您的代码。

于 2013-01-09T15:23:42.103 回答
1

做同样事情的另一种方法:

(defun remove-all-nth (list period)
   (remove-if
    (let ((iterator 0))
      (lambda (x)
        (declare (ignore x))
        (= 0 (mod (incf iterator) period)))) list))
(remove-all-nth '(1 2 3 4 5 6 7 8 9 0) 3)
; (1 2 4 5 7 8 0)
于 2013-01-09T16:15:24.387 回答
1

也许这里有一个更学术的递归解决方案:

(defun delete-nth (n list)
  (labels ((rec (i list)
             (cond ((null list) nil)
                   ((= i 1) (rec n (cdr list)))
                   (t (cons (car list) (rec (1- i) (cdr list)))))))
    (rec n list)))

但在现实生活中,我会使用上面的循环选项。

于 2013-01-09T22:36:31.713 回答