C 언어 팩토리얼 구현: 재귀와 반복 방식 비교

팩토리얼 계산은 C 언어 학습 과정에서 자주 등장하는 기초 알고리즘 문제입니다. n 팩토리얼은 1부터 n까지 모든 양의 정수를 곱한 값으로, 수학적으로 n!로 표기합니다. 예를 들어 6! = 6 × 5 × 4 × 3 × 2 × 1 = 720입니다.

C 언어로 팩토리얼을 구현할 때 주로 두 가지 접근법을 사용합니다. 첫째는 함수가 자기 자신을 호출하는 재귀적 방식이며, 둘째는 반복문을 활용한 방식입니다.

재귀적 구현

재귀 방식은 수학적 정의를 코드에 직접 옮긴 것처럼 직관적입니다. n! = n × (n-1)!라는 관계를 이용하며, 기저 사례(base case)로 n이 0이나 1일 때 1을 반환합니다.

#include <stdio.h>

unsigned long long compute_fact(int value) {
    if (value <= 1) {
        return 1;
    }
    return value * compute_fact(value - 1);
}

int main(void) {
    int input;
    printf("정수 입력: ");
    scanf("%d", &input);
    
    if (input < 0) {
        printf("음수는 팩토리얼이 정의되지 않습니다.\n");
    } else {
        printf("%d! = %llu\n", input, compute_fact(input));
    }
    return 0;
}

이 방식의 장점은 코드가 간결하고 이해하기 쉽다는 점입니다. 단점은 깊은 재귀 호출 시 스택 오버플로우가 발생할 수 있으며, 함수 호출 오버헤드로 인해 상대적으로 느릴 수 있습니다.

반복문 구현

반복문을 사용하면 재귀 호출 없이 동일한 결과를 얻을 수 있습니다. 스택 메모리 사용량이 일정하게 유지되며, 대부분의 경우 더 나은 성능을 보입니다.

#include <stdio.h>

unsigned long long iterative_fact(int value) {
    unsigned long long product = 1;
    int counter;
    
    for (counter = 2; counter <= value; counter++) {
        product *= counter;
    }
    return product;
}

int main(void) {
    int number;
    printf("계산할 수 입력: ");
    scanf("%d", &number);
    
    printf("결과: %llu\n", iterative_fact(number));
    return 0;
}

데이터 타입 고려사항

팩토리얼 값은 매우 빠르게 증가합니다. 20!은 이미 2,432,902,008,176,640,000으로 unsigned long long(최대 약 1.8×1019)의 범위를 넘어갑니다. 더 큰 값을 다루려면 여러 워드로 구성된 큰 정수(big integer) 라이브러리를 사용해야 합니다.

nn!비고
103,628,800int 범위 내
12479,001,600signed int 최대
20~2.43×101864비트 한계

실무에서는 입력값 검증과 오버플로우 체크를 함께 구현하는 것이 안전합니다.

태그: C 팩토리얼 재귀함수 반복문 알고리즘

5월 23일 19:53에 게시됨