薩姆

2013-12-13 81 views
1

我有兩個矢量陣列:薩姆

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

只想用T2 結果總結t1的值是這樣的:

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的長度> T2

回答

-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)))))) 
+2

您只能計算一次最小長度,並將其放入某個詞彙變量中作爲「do」的一個入口。 :)和'C'。現在'c'是一個特殊的全局變量 - 通常是程序員的錯誤,如果沒有特殊原因的話。 –

+0

'c'是一個未定義的變量。 –

1

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

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

太棒了! :) ...你的意思是,使用最短的矢量來代替't2'。 CLHS還說「填充指針設置爲函數應用的次數」,因此可能需要注意這一點。 :) –

+0

erhm,我的意思是最長的。 :) –

+0

正確,更新的代碼有條件地交換t1和t2。 OP使用簡單向量,所以不確定是否需要考慮填充指針。 –

0

如果你想使用自下而上&功能的方法來此,這裏是它會怎樣看:

(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)或者你有但許多載體。