데이타구조
2016-03-25
귀납적 정의(inductive definition)와
재귀(recursion 순환, 되돌기 등으로도 번역)
과제2 (Due: 3/28일 월요일 밤)
-
... (과제 1번은 2/21일 월요일 밤까지였습니다)
- 이번 수업에서 다룬 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}
0∈N n+1∈N⟵n∈N
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
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}
NULL∈List new list({n,ℓ})∈List⟵ℓ∈List
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
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}
NULL∈List new list({n,ℓ})∈List⟵ℓ∈List
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
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}
NULL∈Tree new tree({n,tl,tr})∈Tree⟵tl,tr∈Tree
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}
NULL∈Tree new tree({n,tl,tr})∈Tree⟵tl,tr∈Tree
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 예고
- list* copy(list* l)
// l과 같은 데이타를 같은 순서로 가진 새로운 리스트 생성 - list* append(list* l1, list* l2)
// l1 다음에 l2를 이어붙인 새로운 리스트 생성 - tree의 데이타를 list에 복사하기
- list* inorder(tree* t)
- list* preorder(tree* t)
- list* postorder(tree* t)
데이타구조
By 안기영 (Ahn, Ki Yung)
데이타구조
2016-03-25
- 1,813