使用内置的map和zip函数,定义一个Scheme函数zipadd,该函数接受两个数字列表,并返回一个由相加在一起的相应元素组成的列表。你可以假设这些列表的长度是一样的。例如(zipadd '(1 2 3) '(4 5 6))是(5 7 9)。(不使用zip和map的正确解决方案将值8分。)
我不知道该怎么做。我真的很想在明天考试前知道答案。有谁能帮帮我吗?
发布于 2012-12-11 08:22:27
对于初学者来说,starters没有附带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)))最后,为了完整起见,给出了一个不使用map或zip的解决方案。它是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(*)记住:假设两个列表具有相同的长度。
尝试编写解决方案的所有变体,比较解决同一问题的不同方法将是很有趣的。如果你必须使用map和zip来获得满分,那么一定要使用上面的第二个版本,但要知道,这不是表达手头问题的解决方案的最简单也不是最有效的方式。
https://stackoverflow.com/questions/13811504
复制相似问题