데이타구조

2016-03-25

 

귀납적 정의(inductive definition)
재귀(recursion 순환, 되돌기 등으로도 번역) 

과제2 (Due: 3/28일 월요일 밤)

  1. ... (과제 1번은 2/21일 월요일 밤까지였습니다)

  2. 이번 수업에서 다룬 NULL로 끝나는 연결 리스트에 대해
    • 리스트의 맨 끝에 원소를 하나 추가하는 프로그램 작성
    • 순서를 거꾸로 뒤집은 리스트를 만드는 프로그램 작성
  • 지난 과제1번과 마찬가지 방식으로 진행
  • 이번 과제는 main함수 이외에 다른 함수 작성 안해도 됩니다.
  • Google Drive 자신의 공유폴더에 hw2.cpp 파일명으로 제출
  • 반드시 컴파일되는지 확인. 컴파일 에러나면 0점.
  • 홈페이지에 과제를 시작할 수 있도록 hw2.cpp 파일을 제공하니 그 파일을 수정하는 방식으로 과제를 하고 제출하면 됩니다

과제 제출 안내

  • Google Drive 공유 폴더를 통해 (종이 X, 메일 X)
  • [새로 만들기] 버튼을 눌러
    DS16<이름><학번> 폴더를 만들고 (예: DS16김연아123456)
    만들어진 폴더를 우클릭하여
    폴더 공유설정으로 kyagrd@gmail.com 에게 공유 (편집권한)
  • Google 메일 계정만 있으면 Google Drive 서비스 이용 가능 
  • Google 메일 계정은 무료로 만들 수 있으며
    참고로 안드로이드 스마트폰 사용자는 누구나 이미 보유

factorial 함수

// iterative version   n! = n*(n-1)*...*1
int factorial(int n) {
    int product = 1;
    for(int i=n; i>0; --i) product = product * i;
    return product;
}

// recursive version   0!=1, n!=n*(n-1)!
int factorial(int n) {
    if (n < 1) return 1;
    else       return n * factorial(n - 1);
}


// tail recursive version
int fact(int product, int n) {
    if (n < 1) return product;
    else       return fact(product * n, n - 1);
}

int factorial(int n) { return fact(1, n); }

자연수의 귀납적 정의 복습

\begin{matrix}0 \in \mathbb{N} \qquad~~~ \\ n+1 \in \mathbb{N} \longleftarrow n\in\mathbb{N} \end{matrix}
0N   n+1NnN\begin{matrix}0 \in \mathbb{N} \qquad~~~ \\ n+1 \in \mathbb{N} \longleftarrow n\in\mathbb{N} \end{matrix}
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
int factorial(int k) {
    if (k < 1) // k=0   (base case)
        return 1;                    // 0! = 0
    else       // k=n+1 (inductive case)
        return k * factorial(k - 1); // (n+1)!=(n+1)*n!
}

리스트의 귀납적 정의 복습

\begin{matrix}\text{NULL} \in List \quad~~ \\ new~list(\{n, \ell\}) \in List \longleftarrow \ell\in List \end{matrix}
NULLList  new list({n,})ListList\begin{matrix}\text{NULL} \in List \quad~~ \\ new~list(\{n, \ell\}) \in List \longleftarrow \ell\in List \end{matrix}
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
int length(list* l) {
    if (l == NULL) return 0;
        // length(NULL) = 0
    else return 1 + length(l->next);
        // length(new list({n,l})) = 1 + length(l)
}





// iterative version
int length(list* l) {
    int len=0;
    for(list* p=l; l!=NULL; p=p->next) ++len;
    return len;
}

리스트의 귀납적 정의 복습

\begin{matrix}\text{NULL} \in List \quad~~ \\ new~list(\{n, \ell\}) \in List \longleftarrow \ell\in List \end{matrix}
NULLList  new list({n,})ListList\begin{matrix}\text{NULL} \in List \quad~~ \\ new~list(\{n, \ell\}) \in List \longleftarrow \ell\in List \end{matrix}
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
int sum(list* l) {
    if (l == NULL) return 0;
        // sum(NULL) = 0
    else return l->data + sum(l->next);
        // sum(new list({n,l})) = n + sum(l)
}



// iterative version
int sum(list* l) {
    int s = 0;
    for(list* p=l; l!=NULL; p=p->next) s += p->data;
    return s;
}

이진트리의 귀납적 정의 복습

\begin{matrix}\text{NULL} \in Tree \quad~~ \\ new~tree(\{n, t_l, t_r\}) \in Tree \longleftarrow t_l,t_r\in Tree \end{matrix}
NULLTree  new tree({n,tl,tr})Treetl,trTree\begin{matrix}\text{NULL} \in Tree \quad~~ \\ new~tree(\{n, t_l, t_r\}) \in Tree \longleftarrow t_l,t_r\in Tree \end{matrix}
struct tree { int data; tree* left; tree* right; };
// 이진트리에 들어있는 데이타 개수
int size(tree* t) {
    if (t == NULL) return 0;
     // size(NULL) = 0
    else return 1 + size(t->left) + size(t->right);
     // size(new tree({n,tl,tr})) = 1 + size(tl) + size(tr)
}

이진트리의 귀납적 정의 복습

\begin{matrix}\text{NULL} \in Tree \quad~~ \\ new~tree(\{n, t_l, t_r\}) \in Tree \longleftarrow t_l,t_r\in Tree \end{matrix}
NULLTree  new tree({n,tl,tr})Treetl,trTree\begin{matrix}\text{NULL} \in Tree \quad~~ \\ new~tree(\{n, t_l, t_r\}) \in Tree \longleftarrow t_l,t_r\in Tree \end{matrix}
struct tree { int data; tree* left; tree* right; };
// 이진트리에 들어있는 데이타의 총합
int sum(tree* t) {
    if (t == NULL) return 0;
     // sum(NULL) = 0
    else return n + sum(t->left) + sum(t->right);
     // sum(new tree({n,tl,tr})) = n + sum(tl) + sum(tr)
}

과제3 예고

  1. list* copy(list* l)
    // l과 같은 데이타를 같은 순서로 가진 새로운 리스트 생성
  2. list* append(list* l1, list* l2)
    // l1 다음에 l2를 이어붙인 새로운 리스트 생성
  3. tree의 데이타를 list에 복사하기
    • list* inorder(tree* t)
    • list* preorder(tree* t)
    • list* postorder(tree* t)

데이타구조

By 안기영 (Ahn, Ki Yung)