使用Scheme中的map和lambda计算点积

时间:2015-09-01 17:31:48

标签: lambda scheme map-function

计算两个向量vw的点积。我的想法是在向量​​中获得第一项的乘积,并使用累积函数将它们全部加在一起。

 (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函数的工作方式有很大的麻烦,谢谢你的解释。

2 个答案:

答案 0 :(得分:4)

您调用map的方式不会产生预期的效果。给出(list v w)列表意味着您的函数被调用两次,一次使用v,一次使用w(无论这些列表中有多少项都有)。

相反,这样做:

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

在这里,您将两个列表传递给map,这意味着它将使用两个参数调用您的函数(在这种情况下为*):每个列表对应一个。

答案 1 :(得分: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)