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))))

次の n 番目などを削除したい

また、私はこれを試しました:

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

やり直す方法がわからない

私が考えていたのは連結でしたが、自分の位置を追跡する方法がわかりません。

4

3 に答える 3

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 に答える
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 に答える