Structure and Interpretation of Computer Programs 1.1
这几天没啥事的时候就看看这本书,感觉这书看上去就5章,可是每一章都好多内容,习题也不少,以前还打算每一章写一次习题报告,现在改变想法了,每一节写一下相关知识点习题解答,有些习题解答不怎么好描述,就在网上找了相关的链接放在这里。
1.1 The Elements of Programming
主要介绍了一些基本东西,然后还介绍了一些scheme的基本语法之类的,分为3个方面讲: 1.primitive expressions; 2.means of combination; 3.means of abstraction. 这个过程中讲解了scheme的一些基本语法,scheme的procedure怎么跑的,怎么写基本的procedure,以保证读者可以用scheme来完成接下来的习题。
另外讲述了用Newton方法求平方根以及一些优化,Newton方法求平方根就是首先猜测一个值,然后看这个值是否足够好(平方之后是否和这个数相差很小),然后如果不足够好的话,就用(y+x/y)/2来更新y,其中y是猜测的值,x是我们需要求平方根的值。
函数/过程再调用的时候应该是一个黑箱操作,也就是我们只需要知道参数是什么,会返回什么,但是我们不需要知道里面的具体实现是什么。相应的,在实现函数/过程的时候,参数的取名就尽量取得有意义些,让调用这个函数/过程的人能够更好的使用它。
下面是1.1节习题以及简要说明
1.1 要读者写出每条语句会输出的答案,这个题目看过前面的知识之后,就没问题了,可以看这里对照答案
1.2 把一个算术表达式转化为前缀表达式,(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 1 3))))) (* 3 (- 6 2) (- 2 7))), 注意括号
1.3 定义一个procedure,接受3个参数,然后返回其中2个较大的值的平方和 我的程序:
- (define (square-larger x y z)
- (if (> x y)
- (if (> z y)
- (+ (square x) (square z))
- (+ (square x) (square y))
- )
- (if (> z x)
- (+ (square y) (square z))
- (+ (square y) (square x))
- )
- )
- )
可以在这里看到更多种方法来解决这个问题
1.4给出一个procedure,让你解释这个procedure。”如果b > 0 那么返回a+b 否则返回a-b”
1.5给出一个procedure和调用procedure的语句,然后让你用applicative-order和normal-order分析这个procedure会输出什么,你看过applicative-order和normal-order的知识之后,就基本可以得到了,applicative-order是每次参数是procedure的话,就会调用procedure得到相应的答案,所以这里的话就会出现死循环了,但是normal-order的话就不管这么多了,等到需要这个procedure的返回值的时候,它才会去调用相应的procedure,所以这里就返回0
1.6给你一个代替if的new-if procedure,然后让你判断用new-if写出来的Newton方法在scheme下运行会输出什么。这个就用到了1.5中的相关知识了,因为scheme解释器用的是applicative-order,所以会死循环。
1.7Newton求平方根的时候,怎么判断足够好,请你给出一个足够好的判断函数。这里可以通过判断每次更新的猜测值后更新前的猜测值之间的关系来判断(用y^2-x的差值来判断的话,对于很小的x和很大的x就会出现大误差),比如更新后的猜测值和更新后的猜测值相差比小于0.01%等,也可以查看这里。
1.8 给你一个更新函数,让你用Newton方法求一个数的三次方根,这个直接可以通过平方根的程序改编而来,当然判断足够好的函数还是需要自己来斟酌的。