Function 将x添加到列表第n项的lisp函数
我需要编写一个lisp函数,将x添加到列表的第n项。例如,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
(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设置为;这是一个常数。