SICP 习题 (2.24)解题总结:列表的结构

SICP 习题 2.24 是列表的巩固题,让我们更清晰的理解列表。

题目要求我们求如下表达式的值:

(list 1 (list 2 (list 3 4)))

因为我是一个程序员,这种事我不会自己求值的,我会让计算机完成。。。。

在Scheme环境里运行以上表达式得到的结果是:

(1 (2 (3 4)))

这个结果并不意外,相对有经验的程序员大概可以猜出来。

题目后来还要求画一个盒子指针结构将以上数据解释成一棵树。

手上没有方便的画图工具,于是用keynote直接画了一个盒子指针图,发现画起来还挺方便的。

注意,理论上讲,列表里有几个)号,图中就应该有几个nil的符号,就是带斜杠的盒子。

时间: 2024-11-08 15:04:22

SICP 习题 (2.24)解题总结:列表的结构的相关文章

SICP 习题 (2.30)解题总结 : Square-Tree

SICP 习题 2.30 要求我们完成一个叫square-tree的过程,其作用和之前的square过程差不多,square过程是针对简单列表的,将列表中的所有元素求平方,然后返回新的平方数列表.不过square不能对嵌套列表进行处理,如果列表中还包含列表的话会报错. 题目要求我们实现一个square-tree的过程,当输入的列表包含另一个列表时可以对嵌套的列表进行处理,生成所有列表元素的平方数. 这个和之前几道题差不多,都是对树状列表的遍历和处理.题目还要求我们用两种方式实现,一种使用map,

SICP 习题 (2.22)解题总结: 迭代过程中的列表处理

SICP 习题 2.22是习题2.21的后续题目,题目中讲到叫Louis Reasoner的人想重写suqare-list过程,希望使用迭代计算过程,而不是递归计算过程,有关迭代计算过程和递归计算过程,如果你没什么印象了,请翻回习题1.9 的解题总结看看. 那个叫Louis Reasoner的人写的迭代版的suqre-list是这样的: (define (square-list-revert items) (define (iter things answer) (if (null? thing

SICP 习题 (2.26)解题总结:列表操作符append cons list

SICP  习题 2.26 也是不需要太多解释的题目, 题目的主要目的是让读者理解append cons list三个操作的差别. 直接运行下面代码中的start-test-2-26过程就可以了,需要留意一下的是append 过程, cons过程和list过程的使用. 最好翻一下mit-schme的参考手册,对了,一直没有提mit-scheme的手册,建议大家去下载一份备用,需要的时候查一查 链接如下: http://www.gnu.org/software/mit-scheme/ 有pdf版可

SICP 习题 (2.17)解题总结:列表的遍历

SICP 习题 2.17 要求我们定义出过程last-pair,它返回只包含给定表里之后一个元素的表. 比如 (last-pair (list 23 72 149 34))的结果应该是(34) 当你开始做这道题的时候你应该已经看完书中有关list操作的内容了,你应该明白car和cdr分别是什么意思,也应该知道如何通过递归调用遍历一个list. 有了以上基础的话完成习题2.17就是小菜一碟啦,基本思路就是不断对目标list进行cdr操作,直到最后一个元素为止. 在递归实现上的基本思路就是看目标li

SICP 习题 (2.18) 解题总结:反转列表

SICP 习题 2.18 要求我们定义一个过程名叫reverse,可以将一个list反转过来. 比如 (reverse (list 1 4 9 16 25)) 的结果是: (25 16 9 4 1) 这道题和之前的2.17有相似之处,都是对list进行遍历,然后做相应处理.不过2.17比较简单,遍历到最后面返回最后的元素就好了,2.18复杂一点,需要在遍历之后将list元素反向组装起来. 我们可以按以前的思路,通过递归来描述整个过程. 其实,(reverse (list 1 4 9 16 25)

SICP 习题 (1.46)解题总结

SICP 习题 1.46 要求我们写一个过程iterative-improve,它以两个过程为参数,其中一个参数用来检测猜测是否足够好,另一个参数用来改进猜测.过程iterative-improve应该返回另一个过程,所返回的过程接收一个参数作为初始猜测,然后不断改进猜测直到结果足够好.题目还要求我们使用iterative-improve重写1.1.7的sqrt过程和1.3.3节的fixed-point过程. 因为涉及到高阶函数,所以整个题目理解起来有一点点费劲.不过这道题作为第一章的收官题确实

SICP 习题 (1.45)解题总结

SICP 习题 1.45是对前面很多关于不动点的习题的总结. 题目回顾了我们之前在1.3.3节使用的不动点寻找方法,当寻找y -> x/y 的不动点的时候,这个变换本身不收敛,需要做一次平均阻尼才可以. 对于y -> x/(y^2)这个变换也可以通过一次平均阻尼使它变得收敛. 不过一次平均阻尼对于四次方程是不够的,就是说,对y -> x/(y^3)这样的变换,一次平均阻尼不足以使它收敛,需要做两次平均阻尼才行. 题目遵从一直以来的抽象原则,要求我们去多做几次测试,找出 y -> x

SICP 习题 (2.23)解题总结:for-each的实现

SICP 习题 2.23 要求我们实现一个for-each过程. for-each过程和map过程其实很像,只不过for-each过程不返回值,如果返回一个值的话也是不包含意义的值. map比较像一个加工厂,进去一堆东西,加工一下,出来另一堆东西. for-each更像一个蒸汽机,进去一堆煤,燃烧一下,产生能量干点活,不出来东西,真的一定要说有东西出来也是煤渣,大家不在乎的东西. 所以for-each更关注的是里面执行的操作. 其实for-each操作在我们日常使用的语言中都会有,如c语言里的f

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

SICP 习题 2.21 开始引入了map,准确来讲,是这道题目前的文章内容开始引入了map. 为了完成本习题,甚至说为了完成本文以后的阅读,请读者一定要理解清楚map的概念,正如书中所说,"map是一种很重要的结构,不仅因为它代表了一种公共模式,而且因为它建立起了一种处理表的高层抽象". 虽然说得非常高大上,但是map的概念理解起来并不困难,最基本的理解就是给你一组东西,你对这组东西执行map操作的话,就是把这组东西里面的成员逐个拿出来执行对应操作. 比如(map  做朋友  土豪们