两个数组LISP的两个值的和

时间:2013-12-13 09:24:16

标签: arrays vector lisp common-lisp

我有两个矢量数组:

t1 (vector 1 2 3) 
t2 (vector 1 2 3 6 4)

我只想将t1的值与t2相加 结果是这样的:

  

t2(2 4 6 6 4)

首先我尝试这段代码:

(defun addition-v2 (t1 t2)
  (if(< (length t1) (length t2))
     (do ((x 0 (+ 1 x)))
     ((>= x (length t1)) t2)
       (setf (aref t2 x) (+ (aref t1 x) (aref t2 x))))))

就像你想象的那样结果是

#(2 4 6 6 4)

好的,但是如果长度为t1&gt;我该怎么办?长度为t2

3 个答案:

答案 0 :(得分:1)

由于您破坏性地更新了t2,因此您可以使用MAP-INTO

(defun addition-v2 (t1 t2)
  (when (> (length t1) (length t2))
    (rotatef t1 t2))
  (map-into t2 #'+ t1 t2))

答案 1 :(得分:0)

如果你想使用自下而上的&amp;功能性方法,这是它的外观:

(defun ensure-length (vec len)
  (let ((vec-len (length vec)))
    (if (< vec-len len)
        (let ((result (make-array len
                                  :initial-element 0)))
          (dotimes (i vec-len)
            (setf (elt result i)
                  (aref vec i)))
          result)
        vec)))

(defun ensure-lengths (vec1 vec2)
  (values (ensure-length vec1 (length vec2))
          (ensure-length vec2 (length vec1))))

(defun ensured-vector-add (vec1 vec2)
  (multiple-value-bind (v1 v2)
      (ensure-lengths vec1 vec2)
    (map 'vector #'+ v1 v2)))

(defun ensured-vector-+ (&rest vs)
  (reduce #'ensured-vector-add vs
          :initial-value #()))

然后你可以调用(ensured-vector-+ t1 t2)或者你有多少个载体。

答案 2 :(得分:-2)

最后在此行中找到了t1t2大小的问题:

((>= x (length c)) t2)

(>= x (length c)需要< length c,因此我使用函数min

也许有其他解决方案,但这个有效!

(defun addition-v2 (t1 t2)
  (if(< (length t1) (length t2))
     (setq c t2)
     (setq c t1))
     (do ((x 0 (+ 1 x)))
         ((>= x (min (length t1) (length t2))) c)
       (setf (aref t2 x) (+ (aref t1 x) (aref t2 x))))))