SICP 연습문제 1.9 ~ 1.13

2013. 1. 30. 02:05
;; ex 1.9
#||
(define (+ a b)
  (if (= a 0)
      b
      (inc (+ (dec a) b))))
in this case,
(+ 4 5)
(inc (+ 3 5))
(inc (inc (+ 2 5)))
(inc (inc (inc (+ 1 5))))
(inc (inc (inc (inc (+ 0 5)))))
(inc (inc (inc (inc 5))))
(inc (inc (inc 6)))
(inc (inc 7))
(inc 8)
9
linear recursive

(define (+ a b)
  (if (= a 0)
      b
      (+ (dec a) (inc b))))
 in this case,
(+ 4 5)
(+ 3 6)
(+ 2 7)
(+ 1 8)
(+ 0 9)
9
linear iterative
||#

;; ex 1.10
(define (A x y)
  (cond ((= y 0) 0)
	((= x 0) (* 2 y))
	((= y 1) 2)
	(else (A (- x 1)
		 (A x (- y 1))))))
#||
(A 1 10)
(A 0 (A 1 9))
(A 0 (A 0 (A 1 8)))
...
(A 0 (A 0 (A 0 (A 0 ... (A 1 1) ... ))))
(A 0 (A 0 ... 2 ...))
(expt 2 10)

so (A 1 x) = (expt 2 x)

(A 2 4)
(A 1 (A 2 3))
(A 1 (A 1 (A 2 2)))
(A 1 (A 1 (A 1 (A 2 1))))
(A 1 (A 1 (A 1 2)))
(A 1 (A 1 (A 0 (A 1 1))))
(A 1 (A 1 (A 0 2)))
(A 1 (A 1 (expt 2 2)))
(A 1 (expt 2 (expt 2 2)))
(expt 2 (expt 2 (expt 2 2)))

so (A 2 x) = 2^2^2^2^...^2 (x is # of 2)

(A 3 3)
(A 2 (A 3 2))
(A 2 (A 2 (A 3 1)))
(A 2 (A 2 2))
(A 2 (expt 2 2))

so (A 3 x) = 2^2^2^2^...^2 (# of 2 is same as 2^2^2^2^...^2 -- there are x-1 # of 2's)
||#

(define (f n) (A 0 n)) ;; returns (* 2 y)
(define (g n) (A 1 n)) ;; returns (expt 2 n)
(define (h n) (A 2 n)) ;; returns 2^2^2^...^2(# of 2's is n)

;; ex 1.11
(define (f-re n)
  (if (< n 3)
      n
      (+ (f-re (- n 1))
	 (* 2 (f-re (- n 2)))
	 (* 3 (f-re (- n 3))))))

(define (f-iter n)
  (define (iter a b c cnt)
    (cond ((< n 3) n)
	  ((= cnt n) a)
	  (else (iter (+ a (* 2 b) (* 3 c)) a b (+ cnt 1)))))
  (iter 2 1 0 2))

;; ex 1.12
(define (pascal-element row col)
  (if (or (< row 3) (= col 1) (= col row))
      1
      (+ (pascal-element (- row 1) col)
	 (pascal-element (- row 1) (- col 1)))))

exercise 1.13은 종이에 했다

Programming/SICP