소스코드

1. Iteration

#include <stdio.h>
#include <time.h>

// 참조 연산자를 통해 넘겨받은 주소값으로부터 값을 참조합니다.
void iteration(int *base, int *exp) {
    int result = 1;
    // 반복적 연산 수행
    for(int i=0; i<*exp; i++) {
        result *= *base;
    }
    printf("Iteration 결과값 : %d\\n", result);
}

int main(void) {
    int base;
    int exponential;

    printf("Input a Base : ");
    scanf("%d", &base);
    printf("Input an Exponential : ");
    scanf("%d", &exponential);
    
    // 입력받은 두 값에 대한 포인터 설정
    int *base_pointer = &base;
    int *exponential_pointer = &exponential;

    clock_t start = clock();
    // 포인터의 주소값을 넘겨줍니다
    iteration(base_pointer, exponential_pointer);
    clock_t end = clock();
    printf("반복 방법\\n걸린 시간 : %ld 클록 틱\\n", end-start);

    return 0;
}

2. Recursion(Simple version)

#include <stdio.h>
#include <time.h>

int recursion_simple(int base, int exp) {

    // 심플버전 순환 수행
    if(exp == 0) {
        return 1;
    } else {
        return base * recursion_simple(base, exp-1);
    }
}

int main(void) {
    int base;
    int exponential;

    printf("Input a Base : ");
    scanf("%d", &base);
    printf("Input an Exponential : ");
    scanf("%d", &exponential);

    clock_t start = clock();
    // 포인터 말고 그냥 복사값 넘기기
    int result = recursion_simple(base, exponential);
    clock_t end = clock();
    printf("순환 방법(심플버전) 결과값 : %d\\n", result);
    printf("걸린 시간 : %ld 클록 틱\\n", end-start);

    return 0;
}

3. Recursion(Efficient version)

#include <stdio.h>
#include <time.h>

int recursion_efficient(int base, int exp) {

    // 효율 버전 순환 수행
    if(exp == 0) {
        return 1;
    }
    else if((exp%2) == 0) {
        return recursion_efficient(base*base, exp/2);
    }
    else {
        return base*recursion_efficient(base*base, (exp-1)/2);
    }
}

int main(void) {
    int base;
    int exponential;

    printf("Input a Base : ");
    scanf("%d", &base);
    printf("Input an Exponential : ");
    scanf("%d", &exponential);

    clock_t start = clock();
    // 포인터 말고 그냥 복사값 넘기기
    int result = recursion_efficient(base, exponential);
    clock_t end = clock();
    printf("순환 방법(효율 버전) 결과값 : %d\\n", result);
    printf("순환 방법(심플버전)\\n걸린 시간 : %ld 클록 틱\\n", end-start);

    return 0;
}

결과

반복

반복

순환(심플 버전)

순환(심플 버전)

순환(효율 버전)

순환(효율 버전)


고찰

디버깅 실패해서 어느 값에서 스택 오버플로우가 발생하는지 확인하지 못했습니다.

VSCode로 작업을 했는데, 기본 디버깅 설정이 잘못되어있는건지, 결과값은 잘 출력이 되는데 디버깅에서는 변수가 값이 제대로 반영이 안된 채로 디버깅이 지속되어서, 좀 더 디버깅 콘솔을 만져보면서 어떻게 사용해야하는지 찾아봐야할 것 같습니다.