2015-09-01 21 views
2

計算兩個向量vw的點積。我的想法是得到向量中第一項的產物,並使用累積函數將它們加在一起。使用map和lambda計算dot-product計劃

(define (dot-product v w) 
    (accumulate + 0 (map (lambda(v,w)(* (car v) (car w))) (list v w)))) 

我不明白爲什麼這不起作用:

(dot-product (list 1 2) (list 3 4)) //output is 12, not the 11 that I anticipated 

我想我有大麻煩了理解map功能在這種情況下是如何工作的,謝謝你的任何解釋。

回答

1

這不是一個答案,但我需要顯示一些代碼。

這顯示了你原來的原因沒有奏效。

讓我們定義vw,這樣我們就可以在例子中使用它們。

> (define v '(1 2)) 
> (define w '(3 4)) 

現在讓我們看看你的計算開始的地方:

> (map (lambda (v,w) (* (car v) (car w))) (list v w)) 
'(3 9) 

這可能不是你所期望的結果。問題是(v,w)被讀者轉換爲(v (unquote w))。你的意思是:

> (map (lambda (v w) (* v w)) v w) 
'(3 8) 

而且如果你將它放入你的原來的例子,你會得到12

注意(lambda (v w) (* v w))相同*

> (map * v w) 
'(3 8) 
4

您調用map的方式不會產生預期的效果。給出(list v w)的列表意味着你的函數被調用兩次,一次使用v,一次使用w(無論每個列表有多少項)。

相反,這樣做:

(define (dot-product v w) 
    (apply + (map * v w))) 

在這裏,你是路過兩個列表來map,這意味着它會調用你的函數(*在這種情況下)有兩個參數:一個是給每個列表。

+0

謝謝!對不起,我仍然對一件事感到困惑:是不是要通過(list v w)中的每個元素去映射?爲什麼這個函數只能被調用兩次? – user3366240

+0

@ user3366240'(list v w)'是兩個元素的列表(第一個元素是'v',第二個元素是'w')。 –

+0

謝謝,這很有道理。但是你知道12是如何計算的嗎?當兩次調用的樂趣應該是3. – user3366240