标签:
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))
标签:
原文地址:http://blog.csdn.net/keyboardota/article/details/39909899