首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Lisp中删除每第n个元素有困难吗?

在Lisp中删除每第n个元素有困难吗?
EN

Stack Overflow用户
提问于 2013-01-09 22:32:34
回答 3查看 822关注 0票数 0

试着学习lisp,想要删除每第n个。我只删除了第一(第n)个元素

代码语言:javascript
复制
(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个,依此类推

我还试过这个:

代码语言:javascript
复制
(defun remove-nth (list n)
(remove-if (constantly t) list :start n :end (+ 1 n)))

不知道如何重新开始

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-10 00:15:24

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

代码语言:javascript
复制
(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)
票数 1
EN

Stack Overflow用户

发布于 2013-01-09 23:23:42

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

代码语言:javascript
复制
(defun remove-every-nth (n list)
  (loop for element in list
        for index from 1
        unless (zerop (rem index n))
          collect element))

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

票数 1
EN

Stack Overflow用户

发布于 2013-01-10 06:36:32

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

代码语言:javascript
复制
(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)))

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14237514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档