首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LISP程序设计考试复习Q

LISP程序设计考试复习Q
EN

Stack Overflow用户
提问于 2012-12-11 08:06:33
回答 1查看 441关注 0票数 1

使用内置的map和zip函数,定义一个Scheme函数zipadd,该函数接受两个数字列表,并返回一个由相加在一起的相应元素组成的列表。你可以假设这些列表的长度是一样的。例如(zipadd '(1 2 3) '(4 5 6))是(5 7 9)。(不使用zip和map的正确解决方案将值8分。)

我不知道该怎么做。我真的很想在明天考试前知道答案。有谁能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-11 08:22:27

对于初学者来说,starters没有附带zip过程,尽管实现一个过程很简单:

代码语言:javascript
复制
(define (zip lst1 lst2)
  (map list lst1 lst2))

现在关于你的问题-只使用map的解决方案是解决这个问题的最简单的方法,它与上面的过程非常相似,只要想一想可以用什么来填补空白:

代码语言:javascript
复制
(define (zipadd lst1 lst2)
  (map <???> lst1 lst2))

尽管它有点做作,但您可以使用zip来获得相同的解决方案(并获得满分)。试着弄清楚它是如何工作的- zip将两个列表中的所有元素对结合在一起,创建了一个由两个元素组成的列表。然后,map将遍历该列表并对每个元素应用一个过程(请记住:每个元素都是一个包含两个元素的列表),创建一个包含结果的新列表:

代码语言:javascript
复制
(define (zipadd lst1 lst2)
  (map (lambda (x) <???>) ; x is a list with two numbers, how to add them?
       (zip lst1 lst2)))

最后,为了完整起见,给出了一个不使用mapzip的解决方案。它是map的一个实现,用于两个列表上的数字必须成对相加的特殊情况:

代码语言:javascript
复制
(define (zipadd lst1 lst2)
  (if <???>                         ; if either list is empty (*)
      <???>                         ; then return the empty list
      (cons (+ <???> <???>)         ; else add the first elements of both lists
            (zipadd <???> <???>)))) ; and advance the recursion over both lists

(*)记住:假设两个列表具有相同的长度。

尝试编写解决方案的所有变体,比较解决同一问题的不同方法将是很有趣的。如果你必须使用mapzip来获得满分,那么一定要使用上面的第二个版本,但要知道,这不是表达手头问题的解决方案的最简单也不是最有效的方式。

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

https://stackoverflow.com/questions/13811504

复制
相关文章

相似问题

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