알고리즘, 자료구조/자료구조

요세푸스의 문제 [순환호출을 잘못 쓰면 어떻게 되나?]

바로이순간 2011. 12. 3. 17:18

#include<iostream>
 
using namespace std;

//
// recursive version one -- ok
// 순환호출을 사용했지만 빠르게 동작함
//
int jos1(int n) {
    int x;
 
    if(n==1) return 1;

    x=jos1(n-1);
    if(x==n-1) return 2;
    if(x==n-2) return 1;
    return x+3;
}
//
// recursive version two -- bad
// 프로그램을 잘못 짜면 아래와 같이 될수도 있슴
// 아주 오래 오래 돔
//
int jos2(int n) {
    int i, x;
 
    if(n==1) return 1;
    for(i=2;i<n+1;++i) {
        x=jos2(i-1);
        if(x==i-1) x=2;
        else if(x==i-2) x=1;
        else x=x+3;
    }
    return x;
}
//
// non recursive version of josephus
// 순환호출을 사용할 필요가 없슴
//
int jos3(int n) {
    int i, x=1;
 
    for(i=1;i<n;++i) {
        if(x==i) x=2;
        else if(x==i-1) x=1;
        else x=x+3;
    }
    return x;
}
 
int main() {
    int i,x,y;
 

    cout<<"Enter number:";
    cin>>x;
    for(i=1;i<x+1;++i) {
        y=jos1(i);
        cout<<y<<" ";
    }
    cout<<endl;
    for(i=1;i<x+1;++i) {
        y=jos3(i);
        cout<<y<<" ";
    }
    cout<<endl;
    for(i=1;i<x+1;++i) {
        y=jos2(i);
        cout<<y<<" ";
    }
    return 0;
}