SICP Chapter 1.1 The Element of Programming

2012. 8. 16. 01:39

1.1장을 공부하면서 생긴 소스파일

chap1_1.scm


;; ex 1.2.
(/ (+ 5 4 (- 2 (- 3 (+ 6 (/ 4 3)))))
   (* 3 (- 6 2) (- 2 7)))

;; ex 1.3.
(define (square x)
  (* x x))

(define (sum-of-squares x y)
  (+ (square x) (square y)))

(define (ex1.3. a b c)
  (cond ((and (< a c) (< a b))
	 (sum-of-squares b c))
	((< b c) (sum-of-squares a c))
	(else (sum-of-squares a b))))

;; ex 1.4.
(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))

;; ex 1.5.
(define (p) (p))
(define (test x y)
  (if (= x 0)
      0
      y))

;; 1.1.7
(define (sqrt-book x)
  (sqrt-iter 1.0 x))
(define (sqrt-iter guess x)
  (if (good-enough? guess x)
      guess
      (sqrt-iter (improve guess x)
                 x)))
(define (improve guess x)
  (average guess (/ x guess)))
(define (average x y)
  (/ (+ x y) 2))
(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))

#|| ex 1.6.
since applicative order

(sqrt 9)
(sqrt-iter 1.0 9)
(new-if (good-enough? 1.0 9) 1.0 (sqrt-iter (improve 1.0) 9))
(new-if #f 1.0 (sqrt-iter 5.0 9))
(new-if #f 1.0 (new-if (good-enough? 5.0 9) 5.0 (sqrt-iter (improve 5.0) 9)))
(new-if #f 1.0 (new-if #f 5.0 (sqrt-iter 3.4 9)))

keep going like this. even after there is #t
||#

;; ex 1.7.
;; try 10000000 and 0.0001
(define (square-root x)
  (sqrt-iter1 1.0 x))
(define (sqrt-iter1 guess x)
  (if (good-enough?1 guess (improve guess x))
      guess
      (sqrt-iter1 (improve guess x) x)))
(define (good-enough?1 x n)
  (< .999 (/ n x) 1.001))
(define (improve guess x)
  (average guess (/ x guess)))
(define (average x y)
  (/ (+ x y) 2))

;; ex 1.8.

(define (cube-root x)
  (define (cube-root-iter guess)
    (if (good-enough?c guess (improve-c guess))
	guess
	(cube-root-iter (improve-c guess))))
  (define (good-enough?c guess next)
    (< .999 (/ next guess) 1.001))
  (define (improve-c guess)
    (/ (+ (/ x (square guess)) (* 2 guess)) 3))
  (cube-root-iter 1.0))


Programming/SICP