SICP丢在一旁一年有余, 越来越觉得里边的内容值得读读, 是时候行动了.就从本篇开始吧, 加油, 坚持.
练习题答案: http://eli.thegreenplace.net/category/programming/lisp/sicp/
IDE(DrRacket)下载地址: http://racket-lang.org/
程序设计的基本元素
基本表达式 用于表示最简单的个体
组合的方法 通过他们可以从简单构造出复合的元素
抽象的方法 对复合对象重命名, 并将它们当做单元去操作
定义过程的一般形式
定义过程的一般形式: (define (<name> <formal paremeters>) <body>)
例: 定义一个求平方的过程.
(define (square x) (* x x))
可以利用square这个过程作为基本结构再去构成其他过程, 比如求一个数的四次方.
(define (double-square x) (square (square x)))
条件表达式
条件表达式的一般形式: (cond (<p1> <e1>) (<p2> <e2>)...(<pn> <en>))
例: 求一个数的绝对值.
(define (abs x) (cond ((> x 0) x) ((= x 0) 0) ((< x 0) (- x))))
另外还可以用if表达式, 它适用于只有两种情况的分析. 求一个数绝对值, 要么小于0返回它的相反数, 要么返回它本身.
(define (f x) (if (< x 0) (- x) x))
练习1.6
看上去按照常规思维貌似没什么问题, 我也想了好一会, 最后看答案才知道什么原因. 原来Scheme里的cond表达式把每一个条件分支都会执行一遍. 如果cond每一行加一个类似C#中的"break"应该会解决这个问题.
练习1.7结合练习1.8
(define (sqrt-Begin guessValue x) (let ((improved-guess (improve guessValue x))) (if (close-enough? guessValue improved-guess) improved-guess (sqrt-Begin improved-guess x)))) (define (close-enough? a b) (let ((ratio (/ a b))) (and (< ratio 1.001) (> ratio 0.999)))) (define (cube x) (* x x x)) (define (sqrts x) (sqrt-Begin 1.0 x)) (define (improve guessValue x) (average (/ x (* guessValue guessValue)) (* 2 guessValue))) (define (average a b) (/ (+ a b) 3))