多年之后再次找回SICP
历史
很久之前翻看过 SICP
, 最早的时候大概是本科的时候,那个时候编程的基本概念也掌握
的不是很好,对 SICP
里面的递归思想就非常难以理解。
后来大概在研究生的时候再次翻看 SICP
, 那个时候大概有一些 Python
的编程基础,
但跟起来还是有一点痛苦。就是大概能理解文彬是想要表达的意思,但是很难做出来课后的
习题。
现在
感觉最近比较大的改变一个是自己开始能分拆一个比较大的项目,然后把各个功能点拆开,
另外一个比较大的帮助也是最近两年在比较严肃的学习 Haskell
, Haskell
的整个思
路和 SICP
里面的思路也都比较像,类似 Stream
之类的概比如。
今天突然又想到这本书,网上 MIT
有免费的英文版本,排版相当精美,地铁上看了一会,
回家也做了一下那个习题,大概在博客这里面记录一下。
;;these are the code on the class
(define tolerance 0.00001)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2) (< (abs (- v1 v2))
tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
(define (fixed-point-of-transform g transform guess)
(fixed-point (transform g) guess))
(define (average x y) (/ (+ x y) 2))
(define (sqrt x)
(fixed-point (lambda (y) (average y (/ x y)))
1.0))
(define (cube x) (* x x x))
(define dx 0.00001)
(define (deriv g)
(lambda (x) (/ (- (g (+ x dx)) (g x)) dx)))
(define (newton-transform g)
(lambda (x) (- x (/ (g x) ((deriv g) x)))))
(define (newtons-method g guess)
(fixed-point (newton-transform g) guess))
;; problem 1-40
(define (cubic a b c d)
(lambda (x)
(+ (* a x x x) (* b x x) (* c x) d)))
;; problem 1-41
(define (double f)
(lambda (x) (f (f x))))
(((double (double double)) inc) 5)
;; problem 1-42
(define (compose f g)
(lambda (x) (f (g x))))
;; problem 1-43
(define (square x) (* x x))
;; ((repeated square 2) 5)
(define (repeated f n)
(if (= n 1)
f
(compose f (repeated f (- n 1)))))
;; problem 1-44 smooth
(define (smooth f)
(lambda (x)
(average (f (+ x dx))
(f (- x dx)))))
其实环境用的并不是 Scheme
的环境,用的是 Racket
的环境,还好 racket
有个包
叫 SICP
, 可以直接写 Scheme
。很赞。
编程是个修行,SICP
也适合不同的时间拿来再看一次,也许还会有新的收获。