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