SICP 习题 (2.23)解题总结:for-each的实现
2015-01-16 00:31
253 查看
SICP 习题 2.23 要求我们实现一个for-each过程。
for-each过程和map过程其实很像,只不过for-each过程不返回值,如果返回一个值的话也是不包含意义的值。
map比较像一个加工厂,进去一堆东西,加工一下,出来另一堆东西。
for-each更像一个蒸汽机,进去一堆煤,燃烧一下,产生能量干点活,不出来东西,真的一定要说有东西出来也是煤渣,大家不在乎的东西。
所以for-each更关注的是里面执行的操作。
其实for-each操作在我们日常使用的语言中都会有,如c语言里的for,php里的foreach,都是在完成类似的工作。
另外要注意的是Scheme里有for-each过程,系统自带的,SICP的作者要求你实现for-each过程并不是因为Scheme里没有,而是要让你从最基本的层面上理解for-each和map的差别。
最终实现比较简单,其实也是遍历输入的列表,针对每一个元素执行一个操作。因为在if判断语句中同时要处理动作和递归调用两件事情,所以这里使用了begin过程将多个操作组合在一起顺序执行。
代码如下:
看代码大家可以发现,其实my-for-each方法是有返回值的,就是传入的列表本身,不过,因为for-each返回的结果是大家不关心的,所以不需要去留意它的返回值。
for-each过程和map过程其实很像,只不过for-each过程不返回值,如果返回一个值的话也是不包含意义的值。
map比较像一个加工厂,进去一堆东西,加工一下,出来另一堆东西。
for-each更像一个蒸汽机,进去一堆煤,燃烧一下,产生能量干点活,不出来东西,真的一定要说有东西出来也是煤渣,大家不在乎的东西。
所以for-each更关注的是里面执行的操作。
其实for-each操作在我们日常使用的语言中都会有,如c语言里的for,php里的foreach,都是在完成类似的工作。
另外要注意的是Scheme里有for-each过程,系统自带的,SICP的作者要求你实现for-each过程并不是因为Scheme里没有,而是要让你从最基本的层面上理解for-each和map的差别。
最终实现比较简单,其实也是遍历输入的列表,针对每一个元素执行一个操作。因为在if判断语句中同时要处理动作和递归调用两件事情,所以这里使用了begin过程将多个操作组合在一起顺序执行。
代码如下:
(define (my-for-each action items) (if (null? items) '() (begin (action (car items)) (cons (car items) (my-for-each action (cdr items))))))
看代码大家可以发现,其实my-for-each方法是有返回值的,就是传入的列表本身,不过,因为for-each返回的结果是大家不关心的,所以不需要去留意它的返回值。
相关文章推荐
- SICP 习题2.23 实现for-each
- SICP 习题 (2.12)解题总结 :区间的不同实现方式
- SICP 习题 (1.16)解题总结
- SICP 习题 (1.21) 解题总结
- SICP 习题 (1.9) 解题总结:迭代计算过程和递归计算过程
- SICP习题 (1.12)解题总结
- SICP 习题 (1.11) 解题总结:加强版斐波那契数
- SICP 习题 ( 1.17) 解题总结
- SICP 习题 (1.15) 解题总结
- SICP 习题 (1.8) 解题总结:牛顿法求立方根
- SICP 习题 (1.7) 解题总结
- SICP 习题 (1.13) 解题总结
- SICP 习题(1.1,1.2,1.3,1.4)解题总结,起步。
- SICP 习题 (1.22) 解题总结
- SICP 习题 (1.8) 解题总结
- SICP 习题 (1.6) 解题总结
- SICP 习题 (1.20) 解题总结
- SICP 习题 (1.24) 解题总结
- SICP 习题(1.5)解题总结:应用序和正则序
- SICP 习题 (1.10)解题总结:阿克曼函数