您的位置:首页 > 其它

SICP 习题 (2.21)解题总结: map的使用

2015-01-10 20:44 267 查看
SICP 习题 2.21 开始引入了map,准确来讲,是这道题目前的文章内容开始引入了map。
为了完成本习题,甚至说为了完成本文以后的阅读,请读者一定要理解清楚map的概念,正如书中所说,“map是一种很重要的结构,不仅因为它代表了一种公共模式,而且因为它建立起了一种处理表的高层抽象”。
虽然说得非常高大上,但是map的概念理解起来并不困难,最基本的理解就是给你一组东西,你对这组东西执行map操作的话,就是把这组东西里面的成员逐个拿出来执行对应操作。
比如(map 做朋友 土豪们)就是和土豪们中的每一个土豪都做朋友。。。。。
另外要注意的就是map的返回值,map过程会返回一个组,组成员的个数和输入组相同,组成员的值取决于对应的操作。
比如(map 做朋友 土豪们)返回的应该是“土豪朋友们”,个数和“土豪们”相同,不过一个一个都是你朋友了,因为他们都执行的做朋友的操作。
习题2.21要求我们完成的就是接受一个数值列表,然后对每一个元素执行平方操作,然后返回以平方数为元素的列表。
题中给出了两种实现方法,一种是不使用map的,一种是使用map的,而且给出了一些代码框架。
不使用map的代码框架如下:
(define (square-list-1 items)
  (if (null? items)
      '()
      (cons <??> <??>)))


根据我们之前遍历列表的经验我们知道这里需要使用递归,其中的第一个<??>应该是要坐的操作,第二个<??>应该是递归调用square-list。有了思路做起来就比较简单了,完成后的代码如下:
(define (square-list-1 items)
  (if (null? items)
      '()
      (cons (* (car items) (car items)) 
	    (square-list-1 (cdr items)))))


其实,如果使用map的话就更简单,使用(lambda (x) (* x x))作为map操作就可以了,map过程会去遍历列表,将每一个元素拿出来,传递给(lambda (x) (* x x))执行平方操作。完成代码如下:
(define (square-list-2 items)
  (map (lambda (x) (* x x) ) items))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: