SICP学习笔记(P3-P17)

        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))
posted @ 2011-02-01 02:10  Create Chen  阅读(701)  评论(1编辑  收藏  举报