2016-03-25
귀납적 정의(inductive definition)와
재귀(recursion 순환, 되돌기 등으로도 번역)
... (과제 1번은 2/21일 월요일 밤까지였습니다)
// 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); }
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
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!
}
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
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;
}
// 재귀 함수는 다루는 인자 타입의 귀납적 정의에
// 나타나는 구조를 따라가며 작성하면 된다
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;
}
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)
}
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)
}