LISP 编程考试复习题

标签 lisp scheme racket

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

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

最佳答案

对于初学者来说,Racket 没有提供zip 过程,尽管实现一个过程很简单:

(define (zip lst1 lst2)
  (map list lst1 lst2))

现在关于您的问题 - 仅使用 map 的解决方案是解决此问题的最简单方法,并且它与上述过程非常相似,只是想一想可以使用什么填空:

(define (zipadd lst1 lst2)
  (map <???> lst1 lst2))

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

(define (zipadd lst1 lst2)
  (map (lambda (x) <???>) ; x is a list with two numbers, how to add them?
       (zip lst1 lst2)))

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

(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 来获得满分,那么一定要使用上面的第二个版本,请注意这不是表达手头问题的解决方案的最简单也不是最有效的方式。

关于LISP 编程考试复习题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811504/

相关文章:

linux - 如何在 Ubuntu 8.10 中为 6.001 设置 MIT Scheme

Scheme 中的数据库位置

algorithm - 混合函数的增长顺序

python - 来自 Python 字符流的 Lisp 分词器

mongodb - 如何从 map-reduce 集合中获取 _id 元素

compiler-construction - 适用于ARM处理器的Scheme编译器

macros - 有人可以向我解释 'hygiene' 的概念吗(我是方案程序员)?

memory-management - Racket C 结构不会自动回收

functional-programming - 在 lambda 表达式中查找自由变量

lisp - 在 Common Lisp 中为字符串交替大写/小写