Lisp两个列表相乘并添加两个值
问题描述:
我有两个列表,每个列表都有列表中的列表。我想每次都从第一个列表中获取第三个值,并从第二个列表中获取第一个值,然后将这些项目相乘,然后将它们相加。Lisp两个列表相乘并添加两个值
(defvar *list-1* ((item1 1 4) (item2 4 5) (item3 5 8)))
(defvar *list-2* ((1) (3) (5)))
因此,我希望(1×4)+(3 * 5)+(5 * 8)= 59
我有下面的代码到目前为止
(defun get-total (lst lst1)
(loop :for element :in lst
:for element1 :in lst1
:sum (third element)))
答
环可以为你做一些解构,所以你甚至不需要拨打第三个,但可以在第一个列表中循环使用(无零a),这将绑定a到第三个值。除了解构列表清单(b)之外,您可以对第二个列表执行相同的操作。然后,你必须:
(loop :for (nil nil a) :in '((item1 1 4) (item2 4 5) (item3 5 8))
:for (b) :in '((1) (3) (5))
:summing (* a b))
;=> 59
答
即使Joshuas loop
与解构是很整齐,我想我要补充如何改变你的代码做同样的无:
(defun get-total (lst1 lst2)
(loop :for element1 :in lst1
:for element2 :in lst2
:sum (* (third element1) (first element2)))
答
而只是为了好玩,这里是一个非循环版本
(reduce #'+ (mapcar #'* (mapcar #'third *list-1*)
(mapcar #'first *list-2*)))
和另一
(reduce #'+ (mapcar (lambda (x y) (* (third x) (first y)))
*list-1* *list-2*))
我想到了这一点,但很惊讶,与Scheme折叠不同,'reduce'只有一个列表。 – Sylwester 2015-04-02 12:57:45
噢,我想知道这背后的逻辑是什么 – Baggers 2015-04-02 13:17:29