Function 将x添加到列表第n项的lisp函数

Function 将x添加到列表第n项的lisp函数,function,lisp,Function,Lisp,我需要编写一个lisp函数,将x添加到列表的第n项。例如,(add52'(31467))返回(36467) 选择项目是 (defun nthitem (n list) (cond ((equal n 1) (car list)) (t (nthitem (-n 1) (cdr list))))) 将x添加到列表中是: (defun addto (x list) (cond ((null list) nil) (t (cons (+ x (car list

我需要编写一个lisp函数,将x添加到列表的第n项。例如,
(add52'(31467))
返回
(36467)

选择项目是

(defun nthitem (n list)
  (cond ((equal n 1) (car list))
        (t (nthitem (-n 1) (cdr list)))))
将x添加到列表中是:

(defun addto (x list)
  (cond ((null list) nil)
        (t (cons (+ x (car list)) 
                 (addto x (cdr list))))))

但我无法将这两者结合在一起。

您有严重的格式问题,并且在某些位置之间缺少空间。一定要使用一个像Emacs或Kate这样进行括号匹配的编辑器

只是想向您展示如何在不将其从
add更改为
功能的情况下将这两者结合起来

(defun addto (x n list)
  (cond ((null list) nil)
        (t (cons (+ x (car list)) 
                 (addto x (- n 1) (cdr list))))))

因此,除了基本情况外,您的代码还应该有两种情况。一个是
(=n1)
,因为你从1开始计数,而不是0,这是你今天的默认情况,一个是不添加
汽车的
,在
cdr
中执行相同的递归时只需复制即可。祝你好运

我们没有足够的时间使用
nRec
。这里有一个基于
do
reconc
的解决方案。这个想法是沿着列表走下去,以相反的顺序累积列表中的元素,直到找到需要替换的元素的位置。然后你把碎片粘在一起。也就是说,您将一直累积的列表反转,并将其附加到一个由新元素构建的列表中,然后再附加尾部

(defun add (number index list)
  (do ((head '() (list* (first tail) head))
       (tail list (rest tail))
       (index index (1- index)))
      ((zerop index)
       (nreconc head (list* (+ number (first tail))
                            (rest tail))))))
值得一看的是这些值是如何随时间变化的。让我们考虑一个具有更多数字的例子,在每次迭代中查看<代码>头<代码>、<代码>尾部>代码>和<代码>索引<代码>:

CL-USER> (add 90 5 '(0 1 2 3 4 5 6 7 8 9))
(0 1 2 3 4 95 6 7 8 9)

head: ()
tail: (0 1 2 3 4 5 6 7 8 9)
index: 5

head: (0)
tail: (1 2 3 4 5 6 7 8 9)
index: 4

head: (1 0)
tail: (2 3 4 5 6 7 8 9)
index: 3

head: (2 1 0)
tail: (3 4 5 6 7 8 9)
index: 2

head: (3 2 1 0)
tail: (4 5 6 7 8 9)
index: 1

head: (4 3 2 1 0)
tail: (5 6 7 8 9)
index: 0
一旦我们到达
0
,我们就可以通过将
编号
添加到
(汽车尾部)
并将其与
(cdr尾部)
放在一起来获得最终结果的其余部分,即

(list* (+ (car tail) number) (cdr tail)
(nreconc (list 4 3 2 1 0) '(95 6 7 8 9))
;=> (0 1 2 3 4 95 6 7 8 9)
产生

(95 6 7 8 9)
然后使用获取
(4 3 2 1 0)
(95 6 7 8 9)
并获取
(0 1 2 3 4 95 6 7 8 9)
,即

(list* (+ (car tail) number) (cdr tail)
(nreconc (list 4 3 2 1 0) '(95 6 7 8 9))
;=> (0 1 2 3 4 95 6 7 8 9)

现在,如果出于某种原因,您不能使用
do
,例如,这是一个家庭作业,那么该跟踪应该仍然能够为您提供足够的信息,以编写一个带有累加器的直接递归版本。不管怎样,您仍然需要能够
反转
(或
nreverse
)一个列表,并
附加
(或
ncoc
)一些列表在一起(或组合,
revappend
nrecc
)。

使用
setnth

(setq a (list 3 1 4 6 7))

(defun add-number-to-nth-element (arg liste element)
  "Add ARG, a number, to nth ELEMENT of LISTE. "
  (setnth element liste (+ arg (nth element liste)))
  liste)

(add-number-to-nth-element 5 a 1) 

;; ==> (3 6 4 6 7)
;; ==> (3 11 4 6 7)
;; ==> (3 16 4 6 7)
;; ==> (3 21 4 6 7)
;; ==> (3 26 4 6 7)

;;计数元素从0开始,您只需要
n次
setf

emacs-Q
,然后评估以下各项:

(defun add-to-nth (x n ys)
  (when ys (setf (nth n ys) (+ x (nth n ys)))))

(setq foobar  '(1 2 3 4 5))
(add-to-nth 42 1 foobar)

C-h v foobar  ; =>  (1 44 3 4 5)

(add 5 2'(3 1 4 6 7))
中,您应该注意索引
2
处的元素是
4
,而不是
1
,因此结果应该是
(3 1 9 6 7)
。您能列出禁止您
(defun add(x n list)(incf(n list)x))的限制吗
?为什么“when ys”?-ys在这里是必须的。
(N N nil)
返回
nil
。不能将
nil设置为
;这是一个常数。