어떤 수가 두 수의 세제곱을 합한 값일때, 그렇게 만들 수 있는 방법이 2개 이상인 수를 라마누잔 수라고 함. 446 페이지, 연습문제 3.71에 나옴
참고
- 1729(Wikipedia): 첫번째 라마누잔 수로 (9 10)과 (1 12)의 두 가지 조합임, 9*9*9+10*10*10=1*1*1+12*12*12
- Durango Bill’s Ramanujan Numbers and The Taxicab Problem
어떤 수가 두 수의 세제곱을 합한 값일때, 그렇게 만들 수 있는 방법이 2개 이상인 수를 라마누잔 수라고 함. 446 페이지, 연습문제 3.71에 나옴
참고
2.2.1에서 값만 포함된 차례열(sequence)를 대상으로 표현 방법과 연산을 짜 보았다면, 2.2.2에서는 이를 일반화하여 원소에 차례열이 있는 경우까지로 확장하여 설명한다. 그림으로 나타내면 나무꼴 형태가 되며, 주어진 인자가 값인지 쌍인지 확인하기 위해 pair? 술어 프로시저를 사용할 수 있다.
연습문제 2.28 fringe 프로시저를 짜는 부분이 직관적으로 다가오지 않는다. 연습문제 2.24~2.29는 github 참조. 특히 연습문제 2.29 풀이는 스터디 시간에 풀이한 line 420~459 코드가 좀 더 명확하니 참고하시길.
소스 코드는 github suguni/sicp/ch2.1.rkt 참조. line 256 부터 시작함.
2.14~2.16에 대한 해석 추가
책에 정의되어 있는 interval 데이터에 대한 산술연산 프로시저의 결정적 문제는 항등원이 정의되어 있지 않다는 점이다. 즉, A / A = I, A * I = A 를 만족하는 항등원이 정의되어 있지 않다. 2.16에서 말한 흠이 없는 구간-산술 연산 꾸러미를 만드는 것은 항등원을 먼저 정의하고, 이에 따라 위 조건에 맞는 *, / 연산을 다시 짜야 한다. *,/ 연산을 재정의 한 것(실패함)에 대한 내용은 소스 주석 참조.
; ex_2_6
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
(lambda (f) (lambda (x) (f ((n f) x)))))
; one
;(add-1 zero)
;(lambda (f) (lambda (x) (f ((zero f) x))))
;;((zero f) x)
;;((lambda (x) x) x)
;;x
;(lambda (f) (lambda (x) (f x)))
(define one (lambda (f) (lambda (x) (f x))))
; two
;(add-1 one)
;(lambda (f) (lambda (x) (f ((one f) x))))
;((one f) x)
;(((lambda (a) (lambda (b) (a b))) f) x)
;((lambda (b) (f b)) x)
;(f x)
;(lambda (f) (lambda (x) (f (f x))))
(define two (lambda (f) (lambda (x) (f (f x)))))
; three
(define three (lambda (f) (lambda (x) (f (f (f x))))))
; add
;(define (add a b) (lambda (f) (lambda (x) ("?"))))
;suppose a = 3, b = 3
;("?")
;(fa (fa (fa (fb (fb (fb x))))))
;(fa (fa (fa ((b f) x))))
;((a f) ((b f) x))
(define (add a b)
(lambda (f)
(lambda (x)
((a f) ((b f) x)))))
; ex 2.4
; ex 2.5
(define (power x n)
(define (power-iter r c)
(if (= c 0)
r
(power-iter (* r x) (- c 1))))
(power-iter 1 n))
(define (cons a b)
(lambda (m) (m a b)))
(define (car z)
(z (lambda (p q) (power 2 p))))
(define (cdr z)
(z (lambda (p q) (power 3 q))))
; 2.1.3
(define (cons x y)
(define (dispatch m)
(cond ((= m 0) x)
((= m 1) y)
(else (error "error"))))
dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))
; ex 2.2
; point
(define (make-point x y) (cons x y))
(define (x-point p) (car p))
(define (y-point p) (cdr p))
(define (point2str p)
(format "(~a,~a)"
(x-point p) (y-point p)))
(define (print-point p)
(newline)
(display (point2str p)))
; segment
(define (make-segment p1 p2) (cons p1 p2))
(define (start-segment s) (car s))
(define (end-segment s) (cdr s))
(define (segment2str s)
(format "~a->~a"
(point2str (start-segment s))
(point2str (end-segment s))))
(define (print-segment s)
(newline)
(display (segment2str s)))
(define (midpoint-segment s)
(define (average a b) (/ (+ a b) 2))
(let ((p1 (start-segment s))
(p2 (end-segment s)))
(make-point (average (x-point p1) (x-point p2))
(average (y-point p1) (y-point p2)))))
; ex 2.3
; rect
(define (make-rect tl-point br-point) (cons tl-point br-point))
;(define (make-rect p1 p2) (cons p1 p2))
(define (top-left-rect r) (car r))
(define (top-right-rect r)
(make-point (x-point (cdr r)) (y-point (car r))))
(define (bottom-left-rect r)
(make-point (x-point (car r)) (y-point (cdr r))))
(define (bottom-right-rect r) (cdr r))
;(define (top-left-rect r)
; (let ((x1 (x-point (car r)))
; (y1 (y-point (car r)))
; (x2 (x-point (cdr r)))
; (y2 (y-point (cdr r))))
; (make-point (min x1 x2) (max y1 y2))))
;(define (top-right-rect r)
; (let ((x1 (x-point (car r)))
; (y1 (y-point (car r)))
; (x2 (x-point (cdr r)))
; (y2 (y-point (cdr r))))
; (make-point (max x1 x2) (max y1 y2))))
;(define (bottom-left-rect r)
; (let ((x1 (x-point (car r)))
; (y1 (y-point (car r)))
; (x2 (x-point (cdr r)))
; (y2 (y-point (cdr r))))
; (make-point (min x1 x2) (min y1 y2))))
;(define (bottom-right-rect r)
; (let ((x1 (x-point (car r)))
; (y1 (y-point (car r)))
; (x2 (x-point (cdr r)))
; (y2 (y-point (cdr r))))
; (make-point (max x1 x2) (min y1 y2))))
(define (rect2str r)
(format "tl=~a\ntr=~a\nbl=~a\nbr=~a"
(top-left-rect r)
(top-right-rect r)
(bottom-left-rect r)
(bottom-right-rect r)))
(define (print-rect r)
(newline)
(display (rect2str r)))
(define (width-rect r)
(- (x-point (top-right-rect r)) (x-point (top-left-rect r))))
(define (height-rect r)
(- (y-point (top-left-rect r)) (y-point (bottom-left-rect r))))
(define (area-rect r)
(* (width-rect r) (height-rect r)))
(define (girth-rect r)
(+ (* (width-rect r) 2) (* (height-rect r) 2)))