Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 팩토리얼 계산하기: 반복문과 재귀 함수 완벽 가이드


팩토리얼(Factorial)이란?

음이 아닌 정수 n의 팩토리얼은 1부터 n까지의 모든 양의 정수를 곱한 값입니다. 수학에서는 느낌표(!) 기호를 사용하여 표현합니다.

예를 들어, 5의 팩토리얼은 다음과 같이 계산됩니다.

5! = 5 × 4 × 3 × 2 × 1
5! = 120

C++에서는 반복문(for loop)을 사용하는 비재귀 방식과 재귀 함수(recursive function)를 사용하는 방식, 두 가지 방법으로 팩토리얼을 구할 수 있습니다. 아래에서 각각의 구현 방법을 자세히 살펴보겠습니다.

방법 1: 반복문을 사용한 팩토리얼 계산

for 반복문을 사용하면 별도의 함수 호출 없이 간단하게 팩토리얼을 계산할 수 있습니다.

예제 코드

#include <iostream>
using namespace std;
int main() {
    int n = 5, fact = 1, i;
    for(i=1; i<=n; i++)
    fact = fact * i;
    cout<<"Factorial of "<<n<<" is "<<fact;
    return 0;
}

실행 결과

Factorial of 5 is 120

코드 설명

위 프로그램에서 for 반복문은 1부터 n까지 순차적으로 실행됩니다. 매 반복마다 변수 fact에 i가 곱해지며, 반복이 모두 끝나면 fact에는 1부터 n까지 모든 수의 곱, 즉 팩토리얼 값이 저장됩니다.

for(i=1; i<=n; i++)
fact = fact * i;

핵심 로직은 위 코드 단편에 있습니다. 초기값이 1인 fact 변수에 1부터 n까지의 값을 차례대로 곱하는 방식으로 동작합니다.

방법 2: 재귀 함수를 사용한 팩토리얼 계산

재귀 함수는 자기 자신을 다시 호출하는 함수로, 팩토리얼처럼 동일한 연산이 반복되는 문제를 해결할 때 특히 유용합니다.

예제 코드

#include <iostream>
using namespace std;
int fact(int n) {
    if ((n==0)||(n==1))
    return 1;
    else
    return n*fact(n-1);
}
int main() {
    int n = 5;
    cout<<"Factorial of "<<n<<" is "<<fact(n);
    return 0;
}

실행 결과

Factorial of 5 is 120

코드 설명

위 프로그램의 fact() 함수가 바로 재귀 함수입니다. main() 함수에서는 팩토리얼을 구하고자 하는 값을 인자로 전달하며 fact()를 호출합니다.

cout<<"Factorial of "<<n<<" is "<<fact(n);

재귀 함수의 종료 조건(기저 사례)은 다음과 같습니다. 입력값이 0 또는 1이면 fact()는 1을 반환하고, 그 외의 경우에는 n-1을 인자로 하여 자기 자신을 다시 호출합니다. 이 과정이 반복되다가 n이 1에 도달하면 재귀 호출이 멈추고, 각 호출의 결과값이 거슬러 올라가며 곱해져 최종 팩토리얼 값이 계산됩니다.

int fact(int n) {
    if ((n==0)||(n==1))
    return 1;
    else
    return n*fact(n-1);
}

마무리: 어떤 방식을 선택해야 할까?

두 방식 모두 동일한 결과를 출력하지만 각각의 장점이 있습니다. 반복문 방식은 함수 호출 오버헤드가 없고 깊은 재귀로 인한 스택 오버플로우 걱정이 없어 안정적입니다. 반면 재귀 방식은 코드가 간결하고 수학적 정의와 직관적으로 일치하여 가독성이 뛰어납니다. 입력값이 클 가능성이 있다면 반복문 방식을, 코드의 명확성이 중요하다면 재귀 방식을 선택하는 것이 좋습니다.