LISP编程考试复习问答

时间:2012-12-11 00:06:33

标签: lisp scheme racket

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

我不知道该怎么做。我明天想在考试前知道解决方案。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

对于初学者来说,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来获得满分,那么无论如何都要使用上面的第二个版本,请注意这不是最简单也不是最有效的方式表达手头问题的解决方案。