计算两个向量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函数是如何工作的,谢谢您的任何解释。
发布于 2015-09-01 19:13:06
这不是一个答案,但我需要展示一些代码。
这说明了你的原作不起作用的原因。
让我们定义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)发布于 2015-09-01 17:40:12
调用map的方式不会产生预期的效果。给出(list v w)列表意味着您的函数被调用两次,一次用v调用,一次用w调用(不管每个列表有多少项)。
相反,请这样做:
(define (dot-product v w)
(apply + (map * v w)))在这里,您将两个列表传递给map,这意味着它将使用两个参数调用您的函数(在本例中为*):每个给定列表一个。
https://stackoverflow.com/questions/32337659
复制相似问题