【发布时间】:2014-05-26 21:56:49
【问题描述】:
我想添加两个列表:(1 2 3) 和 (5 3 4) 应该产生 (6 5 7)。
该函数应该在相应位置添加元素,所以即使我有 (9 1 2) + ( 5 2 6) ,它也应该产生 (14 3 8)。
我的功能
(defun add(l r)
(setf return-value '())
(loop for i from 0 to (- (length l) 1)
do (setf return-value (cons (+(nth i l)(nth i r)) return-value))
)
(reverse return-value)
)
我怎样才能创建一个类似的函数来减去列表?
【问题讨论】:
-
您一直在问一些相对基本的 Lisp 问题,所有这些问题都与处理数字列表的主题相同。坐下来学习一些 Lisp 教程或一本好的 Lisp 教科书可能会更好。在这个问题和您之前的两个问题之间,您似乎要求我们为您完成大部分项目。即使浏览 HyperSpec 中的 14.1.2 Conses as Lists 和 14.2 The Conses Dictionary 也会有所帮助。
-
我已经设法在不使用 mapcar 的情况下创建了一个减法函数。 @Joshua,我研究了你的解决方案并用它们来解决我的问题。是的,我最初问过我在做一个项目时遇到的问题,但我已经搞定了。再次感谢您的帮助。
-
@BogdanMolinger 你为什么要避免
mapcar?如果您使用mapcar,那么您尝试执行的任务似乎很简单。例如,(defun sum (x y) (digits->number (mapcar '+ x y)))和(defun difference (x y) (digits->number (mapcar '- x y)))(其中digits->number定义在您的其他问题的 my answer 中)。 -
@JoshuaTaylor 我认为 mapcar 可以很好地添加两个列表,我可以在结果上应用
decompose函数,但是很难使用 mapcar 进行减法,因为我可能会得到类似的东西(-10 5 -16 8 9) 考虑到借来的进位,这将更难标准化。 -
随身携带有什么问题?使用我提供的代码,
(digits->number '(-5 2))产生15(即 -5 + 20),(digits->number '(-10 5 -16 8 9))产生96440(我认为这是正确的)。由于您实际上只是在评估多项式,因此它似乎应该起作用。例如,(digits->number (mapcar '- '(2 8 4) '(5 5 5)))和(- 482 555)都产生-73。
标签: lisp common-lisp