在 Scheme 中使用 map 和 lambda 计算点积
Calculate dot-product using map and lambda in Scheme
计算两个向量 v
和 w
的点积。我的想法是获取向量中第一项的乘积,并使用 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
,这意味着它将使用两个参数调用您的函数(在本例中为 *
):每个给定的列表一个。
这不是答案,但我需要显示一些代码。
这说明了为什么您的原件不起作用。
让我们定义 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)
被 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)
计算两个向量 v
和 w
的点积。我的想法是获取向量中第一项的乘积,并使用 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
,这意味着它将使用两个参数调用您的函数(在本例中为 *
):每个给定的列表一个。
这不是答案,但我需要显示一些代码。
这说明了为什么您的原件不起作用。
让我们定义 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)
被 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)