码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-01-10 21:04:37      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

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))




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

标签:

原文地址:http://blog.csdn.net/keyboardota/article/details/39909899

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!