计算两个向量v
和w
的点积。我的想法是在向量中获得第一项的乘积,并使用累积函数将它们全部加在一起。
(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
函数的工作方式有很大的麻烦,谢谢你的解释。
答案 0 :(得分:4)
您调用map
的方式不会产生预期的效果。给出(list v w)
列表意味着您的函数被调用两次,一次使用v
,一次使用w
(无论这些列表中有多少项都有)。
相反,这样做:
(define (dot-product v w)
(apply + (map * v w)))
在这里,您将两个列表传递给map
,这意味着它将使用两个参数调用您的函数(在这种情况下为*
):每个列表对应一个。
答案 1 :(得分:1)
这不是答案,但我需要展示一些代码。
这表明你原来的原因不起作用。
让我们定义v
和w
,以便我们在示例中使用它们。
> (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)