강의

[고급-2] 재귀함수의 설계

Mosu(정종인) 2016. 11. 27. 00:45
반응형

학습 목표

-문제를 통해 수학적인 함수의 관계를 모색하고 이를 함수로 정의할 수 있다.

-다양한 패턴 출력 문제를 통해 수학적 귀납법을 적용할 수 있는 다양한 도메인을 학습할 수 있다.

-경우의 수를 세는 방법을 이해하고 수학적 접근과 정보과학적인 접근의 차이점을 이해할 수 있다.


1. 재귀함수 기초 3


<숫자 뒤집기>

하나의 정수를 거꾸로 출력하는 프로그램.

예)123

{첫번째 방법. 단순 출력} : 1등분

1
2
3
4
5
void f(int n){
    if(n==0return;
    printf("%d", n%10);
    f(n/10);
}
cs

{두번째 방법. 오른쪽 끝의 숫자*(자리수-1) 해서 저장.}(자리수는 으로 구한다. : 2등분

1
2
3
4
int f(int n){
    if(n<0return n;
    return f(n/10)+(n%10)*powf(10.0,(int)log10((double)n);
}
cs

{세번째 방법. 일의자릿수, 가장 큰 자릿수의 위치를 바꿔준다고 생각.} : 3등분

1
2
3
4
int f(int n){
    if(n<0return n;
    return (n%10)*T*f((n%T)/10*10+n/T;//T==log n
}
cs


<별 그리기>

N층의 삼각형 모양의 별을 출력.

{첫번째 방법. i행에 i개의 "*"이 n행에 걸쳐 그려진 별 패턴.}

1
2
3
4
5
6
7
8
void f(int n){
    if(n==1printf("*\n");
    else{
        f(n-1);
        for(int i=0; i<n; ++i) printf("*");
        puts("");//==printf("\n");
    }
}
cs


{두번째 방법. 배열에 현재 줄에 출력할 별을 미리 저장해둔다.}

1
2
3
4
5
6
7
8
9
char star[MAXN+1];
 
void f(int n){
    if(n>1){
        f(n-1);
        star[n]="*";
        puts(star+1);
    }
}
cs


<경우의 수 : 조합(nCk)>

n개 중에서 k개를 고르는 경우의 수.

{첫번째 방법. f(n, k)=n개에서 k개를 고르는 경우의 수}

n=3, k=2라고 가정했을 때, (세 개의 칸에서) f(n, k) = 마지막 칸을 선택한 경우의 수 + 마지막 칸을 선택하지 않은 경우의 수

1
2
3
4
5
int f(int n, int k){
    if(k==n) return 1;
    else if(k==1return n;
    else return f(n-1, k-1)+f(n-1, k);
}
cs


{두번째 방법. nCk의 수학식을 변형.}

f(n, k-1) = n! / { (k-1)! * (n-k+1)! }

=> f(n, k) = f(n, k-1) * { (n-k+1) / k }

1
2
3
4
5
int f(int n, int k){
    if(k==n) return 1;
    else if(k==1return n;
    else return f(n, k-1)*(n-k+1)/k;
}
cs




반응형