2016-10-03 8 views
1

ちょうどLISPを学び始めたところで、次の再帰関数を書く方法を理解しようとしています。同じ長さの2つのリストの内積を求める再帰的LISP関数を書く

は、だから私は、出力が、私は以下の

(defun DOT-PRODUCT (a b) 
    (if (or (null a) (null b)) 
     0 
     (+ (* (first a) (first b)) 
     (DOT-PRODUCT (rest a) (rest b))))) 

書いた11

でなければなりません

(DOT-PRODUCT '(1 2) '(3 4))) 

持っている必要があり、すべてが動作するようです。しかし、それはまだ異なる長さのリストで動作します。同じ長さの数字のリストを使って作業したいと思っています。私たちはそれを持っている必要があります "無効な長さ"を返すコードをどこに追加する必要がありますか?最初の引数がNILであれば、condの第一のブランチで

(defun dot-product (a b) 
    (cond ((null a) (if (null b) 0 (error "invalid length"))) 
     ((null b) (error "invalid length")) 
     (t (+ (* (first a) (first b)) 
       (dot-product (rest a) (rest b)))))) 

、第1必要があります。それは条件付きの形condを使用して異なるケースをチェックするように

答えて

3

簡単な方法は、関数を書き換えることですNILでもなければ、エラーが生成されます。 2番目のブランチでは、aNILではないことがわかっているので、エラーがただちに生成されます。最後に、結果が計算されます。

+0

ifの代わりにcondを使用するための詳細な説明と提案をありがとう。それは本当に役立ちます! – trungnt

0

リストのXとYの要素を対応する乗算:

(mapcar #'* X Y) 

は、リストZの要素を追加します。

(reduce #'+ Z) 

が一緒に入れてください:ドット積:

(reduce #'+ (mapcar #'* X Y)) 
0

乗算対応する要素をリストXとYの:

(mapcar #'* X Y) 

リストZの要素を追加します。

(reduce #'+ Z) 

は一緒に入れてください:ドット積:

(reduce #'+ (mapcar #'* X Y)) 

reducemapcarはの一般化である "MapReduce" コンセプトの基礎ですドットプロダクト、畳み込みインテグラル、無数のマッサージとデータの要約方法などがあります。

関連する問題