1
0
Fork 0

Finish Chapter 1 of SICP

This commit is contained in:
Nguyễn Gia Phong 2018-04-22 22:28:33 +07:00
parent 012592aefa
commit 576ac44fc9
2 changed files with 141 additions and 0 deletions

View File

@ -214,6 +214,7 @@
(define (sum-cubes a b) (sum cube a inc b))
(define (pi-sum a b)
(sum (lambda (x) (/ 1.0 x (+ x 2))) a (lambda (x) (+ x 4)) b))
(define dx 0.00001)
(define (integral f a b dx)
(* (sum f (+ a (/ dx 2.0)) (lambda (x) (+ x dx)) b) dx))
@ -303,3 +304,91 @@
((and (negative? b-value) (positive? a-value))
(search f b a))
(else (error "Values are not of opposite sign" a b)))))
(define (fixed-point f first-guess)
(define (try guess)
(let ((next (f guess)))
(if (good-enough? guess next) next (try next))))
(try first-guess))
(define (sqrt-fixed x)
(fixed-point (lambda (y) (average y (/ x y))) 1.0))
; Exercise 1.35
(define golden-ratio (fixed-point (lambda (x) (inc (/ x))) 1.0))
; Exercise 1.37
(define (cont-frac-recursive n d k)
(define (cont-frac n d k root)
(if (= k 0)
root
(cont-frac n d (dec k) (/ (n k) (+ (d k) root)))))
(if (> k 0)
(cont-frac n d (dec k) (/ (n k) (d k)))
(error "You weirdo!")))
(define (cont-frac-iterative n d k)
(define (cont-frac n d k c)
(if (< c k)
(/ (n c) (+ (d c) (cont-frac n d k (inc c))))
(/ (n k) (d k)))) ; UB if k is not a positive integer
(cont-frac n d k 1))
; Exercise 1.38
(define (e-2 precision)
(cont-frac-iterative
(lambda (i) 1.0)
(lambda (i) (if (= (remainder i 3) 2) (* (inc i) 2/3) 1.0))
precision))
; Exercise 1.39
(define (tan-cf x k)
(cont-frac-iterative
(lambda (i) (if (= i 1) x (square x)))
(lambda (i) ((if (even? i) - +) (dec (* i 2))))
k))
(define (average-damp f) (lambda (x) (average x (f x))))
(define (newton-method g guess)
(define (deriv g)
(lambda (x) (/ (- (g (+ x dx)) (g x)) dx)))
(let ((f (lambda (x) (- x (/ (g x) ((deriv g) x))))))
(fixed-point f guess)))
(define (fixed-point-of-transform g transform guess)
(fixed-point (transform g) guess))
; Exercise 1.40
(define (cubic a b c)
(lambda (x) (+ (cube x) (* (square x) a) (* x b) c)))
; Exercise 1.41
(define (duplicate f) (lambda (x) (f (f x))))
; Exercise 1.42
(define (compose f g) (lambda (x) (f (g x))))
; Exercise 1.43
(define (repeated f times)
(cond ((< times 1) identity)
((= times 1) f)
(else (compose f (repeated f (dec times))))))
; Exercise 1.44
(define (smooth f)
(lambda (x) (/ (+ (f (- x dx)) (f x) (f (+ x dx))) 3)))
(define (repeated-smooth f times) (repeated smooth times))
; Exercise 1.45
(define (root n x)
(fixed-point-of-transform
(lambda (y) (/ x (expt y (dec n))))
(repeated average-damp (log n 2))
1.0))
; Exercise 1.46
(define (iter-improve good-enough improve)
(lambda (x)
(let ((xim (improve x)))
(if (good-enough x xim)
xim
((iter-improve good-enough improve) xim)))))

52
sicp/chapter2.rkt Normal file
View File

@ -0,0 +1,52 @@
#lang sicp
; Exercise 2.1
(define (make-rat n d)
(if (< d 0)
(make-rat (- n) (- d))
(let ((g (gcd n d)))
(cons (/ n g) (/ d g)))))
(define numer car)
(define denom cdr)
(define (print-rat x)
(display (numer x))
(display "/")
(display (denom x))
(newline))
(define (add-rat x y)
(let ((dx (denom x))
(dy (denom y)))
(make-rat (+ (* (numer x) dy)
(* (numer y) dx))
(* dx dy))))
(define (sub-rat x y)
(add-rat x (make-rat (- (numer y)) (denom y))))
(define (mul-rat x y)
(make-rat (* (numer x) (numer y))
(* (denom x) (denom y))))
(define (div-rat x y)
(make-rat (* (numer x) (denom y))
(* (denom x) (numer y))))
(define (equal-rat? x y)
(= (* (numer x) (denom y))
(* (numer y) (denom x))))
; Exercise 2.2
(define make-point cons)
(define x-point car)
(define y-point cdr)
(define make-segment cons)
(define start-segment car)
(define end-segment cdr)
(define (average x y) (/ (+ x y) 2))
(define (midpoint-segment d)
(let ((A (start-segment d))
(B (end-segment d)))
(make-point (average (x-point A) (x-point B))
(average (y-point A) (y-point B)))))
(define (print-point P)
(display "(")
(display (x-point P))
(display ", ")
(display (y-point P))
(display ")")
(newline))