어떤 수가 두 수의 세제곱을 합한 값일때, 그렇게 만들 수 있는 방법이 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)))