1.컴퓨터 언어가 그저 컴퓨터에 연산을 명령하는 방법이 아닌 예전과 다른 새로운 표현수단 이다.
2.큰 소프트웨어의 복잡한 문제를 다루는 기법을 배우고 익히는 데 중점을 둔다.
==>기법이란?
쓰고자 하는 사람의 눈높이에 맞춰 상세한 것들을 감추고 요약을 함으로서 복잡성을 감소시킨다.
이 책에서 쓰는 언어: Lisp
1. 프로시저를 써서 요약하는 방법
계산 프로세스: 데이터를 조작하는 일
1.1. 프로그램 짤 때 바탕이 되는 것
좋은 프로그래밍 언어의 세가지 요건
(좋은 프로그래밍 언어에는)
-기본식: 언어에서 가장 단순한 것을 나타낸다.
(기본 데이터와 기본 프로시저를 나타내고)
-엮어내는 수단: 간단한 것을 모아 복잡한 것으로 만든다.
(프로시저들과 데이터를 엮어서 더 복잡한 것을 만들고)
-요약하는 수단: 복잡한 것에 이름을 붙여 하나로 다룰 수 있게끔 간추린다.
(만든 것들을 간추리는 수단이 있어야한다)
1.1.1. 식
(앞가지 쓰기)를 사용
ex)
(+ (* 3
(+ (* 7 8)
(+ 3 5) ) ) ==> ((((7 * 8) + (3 + 5))*3) + ((10 - 7) + 6))
(+ (- 10 7)
6) )
1.1.2. 이름과 환경
계산하고자 하는 대상에 이름을 붙이는 것 == 변수를 만든다.
ex) (define size 3)
(define circumference (* 2 pi radius))
1.1.3. 엮은식을 계산하는 방법
되도는 프로세스: 어떠한 단계의 규칙이 다른 단계에서도 다시 나타나는 프로세스
ex) 1. 엮은식에서 부분 식의 값을 모두 구한다.
2. 엮은식에서 연산자의 값은 프로시저가 되고, 피연산자의 값은 인자가 된다.
->프로시저를 인자에 적용하여 엮은식의 값을 구한다.
나무꼴 |
*특별한 형태: 보통 계산 규칙으로는 값을 구하지 못하기 때문에 계산규칙이 따로 있어야하 는 문법
ex) (define x 7)
1.1.4 묶음 프로시저
프로시저를 정의하는 방법
(define (<name> <formal parameter>) <body>)
ex) (define (square x) (* x x))
(define (sum-of-squares x y)
(+ (square x) (square y)) //앞에서 정의해놓은 프로시저를 이용할 수 있음
(define (f a) (sum-of-squares (+ a 1) (* a 2)))
1.1.5. 맞바꿈계산법으로 프로시저를 실행하는 방법
ex)
(f 5) (f 5)
(sum-of-squares (+ a 1) (* a 2)) (sum-of-squares (+ a 1) (* a 2))
//맞바꿈 계산법 사용
(sum-of-squares (+ 5 1) (* 5 2)) (sum-of-squares (+ 5 1) (* 5 2))
(+ (square 6) (square 10) ) (+ (square (+ 5 1) (square (*5 2)))
(+ (* 6 6) (* 10 10)) (+ (* (+ 5 1) (* 5 1)) (* (+ 5 2) (* 5 2)))
(+ 36 100) (+ (* 6 6) (* 10 10))
(sum-of-squares (+ a 1) (* a 2)) (sum-of-squares (+ a 1) (* a 2))
//맞바꿈 계산법 사용
(sum-of-squares (+ 5 1) (* 5 2)) (sum-of-squares (+ 5 1) (* 5 2))
(+ (square 6) (square 10) ) (+ (square (+ 5 1) (square (*5 2)))
(+ (* 6 6) (* 10 10)) (+ (* (+ 5 1) (* 5 1)) (* (+ 5 2) (* 5 2)))
(+ 36 100) (+ (* 6 6) (* 10 10))
(+ 36 100)
//'인자 값부터 먼저 구한다' //'끝까지 펼친 후에 줄인다'
1.1.6. 조건 식과 술어
갈래 나누기
(define (<name> <parameter>)
(cond (<p> <e>) //<p> : 술어 참이나 거짓 가운데 하나를 내놓는다.
(<p1> <e1>) // <p>가 거짓이면 <p1>의 답을 구한다.
....
(<pn> <pn>) ) )
(define (<name> <parameter>) //위의 식과의 차이점: 모든 술어가 거짓이여도 최종적 (cond (<p> <e>) 인 답은 정해져있다.
....
(else <pn>)
갈래 나누기
(define (<name> <parameter>)
(cond (<p> <e>) //<p> : 술어 참이나 거짓 가운데 하나를 내놓는다.
(<p1> <e1>) // <p>가 거짓이면 <p1>의 답을 구한다.
....
(<pn> <pn>) ) )
(define (<name> <parameter>) //위의 식과의 차이점: 모든 술어가 거짓이여도 최종적 (cond (<p> <e>) 인 답은 정해져있다.
....
(else <pn>)
(define (<name> <parameter>)
(if (<p> <consequent>
<alternative>) )
* 논리연산: and, or, not //결과값으로 참,거짓을 내놓기때문에 술어에 들어갈수 있음
1.1.7. 연습: 뉴튼 법으로 제곱근 찾기
(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) ) ) // (x + (x / guess)) / 2)
(define (average x y)
(/ (+ x y) 2))
(define (good-enough? guess x) //값이 얼마나 정밀해야하는지 설정해주는
(< (abs (- (square guess) x) ) 0.001) ) // 프로시저
(if (<p> <consequent>
<alternative>) )
* 논리연산: and, or, not //결과값으로 참,거짓을 내놓기때문에 술어에 들어갈수 있음
1.1.7. 연습: 뉴튼 법으로 제곱근 찾기
(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) ) ) // (x + (x / guess)) / 2)
(define (average x y)
(/ (+ x y) 2))
(define (good-enough? guess x) //값이 얼마나 정밀해야하는지 설정해주는
(< (abs (- (square guess) x) ) 0.001) ) // 프로시저
1.1.8. 블랙박스처럼 간추린 프로시저
+ 갇힌 이름(= local value in C programming)
+안쪽정의와 블록구조
+ 갇힌 이름(= local value in C programming)
+안쪽정의와 블록구조
(define (sqrt x) //sqrt라는 이름으로 프로시저를 간추림
(define (good-enough? guess )
(< (abs (- (square guess) x) ) 0.001) )
(average guess (/ x guess) ) )
(if (good-enough? guess)
guess
(sqrt-iter (improve guess x) x) ) )
(sqrt-iter 1.0 ) )
댓글 없음:
댓글 쓰기