使用内置的 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))
现在关于您的问题 - 使用 only 的解决方案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
or的解决方案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
获得满分,那么请务必使用上面的第二个版本,请注意这不是表达手头问题解决方案的最简单也不是最有效的方式。