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

Calculate dot-product using map and lambda in Scheme

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

 (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 函数在这种情况下的工作原理,感谢您的任何解释。

您调用 map 的方式不会产生预期的效果。提供 (list v w) 的列表意味着您的函数被调用两次,一次是 v,一次是 w(无论每个列表有多少项)。

相反,这样做:

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

在这里,您将两个列表传递给 map,这意味着它将使用两个参数调用您的函数(在本例中为 *):每个给定的列表一个。

这不是答案,但我需要显示一些代码。

这说明了为什么您的原件不起作用。

让我们定义 vw 以便我们可以在示例中使用它们。

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

现在让我们看看您的计算从哪里开始:

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

这可能不是您预期的结果。问题是 (v,w) 被 reader 变成了 (v (unquote w))。你的意思是:

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

如果你把它放到原来的例子中,你会得到 12。

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

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