首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用map和lambda在方案中计算点积

用map和lambda在方案中计算点积
EN

Stack Overflow用户
提问于 2015-09-01 17:31:47
回答 2查看 1.1K关注 0票数 2

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

代码语言:javascript
复制
 (define (dot-product v w)
   (accumulate + 0 (map (lambda(v,w)(* (car v) (car w))) (list v w))))

我不明白为什么这不管用:

代码语言:javascript
复制
 (dot-product (list 1 2) (list 3 4)) //output is 12, not the 11 that I anticipated

在这种情况下,我想我很难理解map函数是如何工作的,谢谢您的任何解释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-01 19:13:06

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

这说明了你的原作不起作用的原因。

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

代码语言:javascript
复制
> (define v '(1 2))
> (define w '(3 4))

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

代码语言:javascript
复制
> (map (lambda (v,w) (* (car v) (car w))) (list v w))
'(3 9)

这可能不是你所期望的结果。问题是(v,w)被读者转化为(v (unquote w))。你的意思是:

代码语言:javascript
复制
> (map (lambda (v w) (* v w)) v w)
'(3 8)

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

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

代码语言:javascript
复制
> (map * v w)
'(3 8)
票数 1
EN

Stack Overflow用户

发布于 2015-09-01 17:40:12

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

相反,请这样做:

代码语言:javascript
复制
(define (dot-product v w)
  (apply + (map * v w)))

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32337659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档