2015년 1월 5일 월요일

컴퓨터 프로그램의 구조와 해석(1) 1장 1

머리말

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))
                                   
                                                                          (+  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>)
     (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)
                +안쪽정의와 블록구조





(define (sqrt  x)                                             //sqrt라는 이름으로 프로시저를 간추림
  (define  (good-enough?  guess )                 
        (<  (abs  (-  (square  guess)   x) )   0.001) )  
  (define (improve  guess)                    //x는 sqrt에서 이미 선언되어 있으므로 생략
       (average  guess  (/ x  guess) ) )        
(if  (good-enough?  guess)
        guess
        (sqrt-iter  (improve  guess  x)  x) ) )
(sqrt-iter 1.0 ) )


댓글 없음:

댓글 쓰기