尝试将子列表列表中的所有元素与lisp中另一个列表中的元素相乘

时间:2015-05-31 22:06:05

标签: list common-lisp

我试图将带有n个子列表的列表与带有n个标量的列表相乘。它应该像这样工作:

(kmult-matrix '((3 4 2 4) (2 5 6 9) (1 -2 8 10))   '(2 3 5)) 
=> ((6 8 4 8) (6 15 18 27) (5 -10 40 50))

每个第n个子列表与第二个列表中的第n个标量相乘。这就是我到目前为止所得到的:

(defun kmult-matrix (m k)
  (apply 'append (mapcar (lambda (x1)
            (mapcar (lambda (x2)
                            (mapcar (lambda (x3)
                                    (* x3 x1))
                                    x2))
                          m))
          k)))

结果是:

((6 8 4 8) (4 10 12 18) (2 -4 16 20) (9 12 6 12) (6 15 18 27) (3 -6 24 30) (15 20 10 20) (10 25 30 45) (5 -10 40 50))

希望可以问这个,因为它是一个分配,我觉得我离解决方案不远。顺便说一句,我必须使用mapcar。

1 个答案:

答案 0 :(得分:3)

比这更容易。请记住,(defun kmult-matrix (m k) (mapcar (lambda (list k) ;; inside here you get a list and ;; it's corresponding multiplier k ...) m k)) 可以使用多个列表。因此:

m

外部地图的结果将是一个列表,其中包含与子列表k(以及lst中的相应元素)一样多的元素。在lambda内部,您在 var treasures: [Treasure] = [] treasures = [treasureA, treasureB, treasureC, treasureD, treasureE] let rectToDisplay = self.treasures.reduce(MKMapRectNull) { (mapRect: MKMapRect, treasure: Treasure) -> MKMapRect in // 2 let treasurePointRect = MKMapRect(origin: treasure.location.mapPoint, size: MKMapSize(width: 0, height: 0)) // 3 return MKMapRectUnion(mapRect, treasurePointRect) } 上执行另一个映射,该映射执行每个元素的乘法运算。以便内部地图在外部地图中为每个元素生成一次列表答案。