본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/재귀 함수 (5)

[C++] 팩토리얼 : 10872번 (런타임 에러 해결)

by 17번 일개미 2022. 7. 6.
728x90

문제

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.


해석

 

팩토리얼이란 ! 기호로 나타내며, 예를 들어 4! 은 4 * 3 * 2 * 1 이다.

N! 을 재귀함수로 프로그램을 구현하면 된다.

 

풀이

#include <iostream>
using namespace std;

int Factorial(int N) 
{
	if (N == 0 || N == 1)
	{
		return 1; // 0과 1은 1반환
	}
	return N *= Factorial(N - 1); // 1을 뺀 수를 재귀
}

int main()
{
	int N; // 정수
	cin >> N;
	cout << Factorial(N);
	return 0;
}

 

7차례 정도 제출을 했는데 계속 런타임 에러가 발생했다.

여기 저기 찾아본 결과, 내 코드와 다른 점을 찾지 못했다.

 

그런데, 다시한번 자세히 보니 미세한 차이가 있었다.

 

재귀함수의 기존 코드

int Factorial(int N) 
{
	if (N == 0 || N == 1)
	{
		return 1; // 0과 1은 1반환
	}
	else N *= Factorial(N - 1); // 1을 뺀 수를 재귀
}

재귀함수의 새로운 코드

int Factorial(int N) 
{
	if (N == 0 || N == 1)
	{
		return 1; // 0과 1은 1반환
	}
	return N *= Factorial(N - 1); // 1을 뺀 수를 재귀
}

 

기존 코드에서는 if문과 else문을 연결해서 재귀를 했었으나,

재귀함수를 완벽히 이해하지 못해서 생긴 문제다.

이 부분을 return 으로 재귀함수를 호출하는 방식으로 변경한 후,

런타임 에러 문제를 해결할 수 있었다. 아마 return을 하지 않고 else 로 또 다른 재귀를 호출하게 되면

기존 함수가 정상적으로 종료되지 않기 때문이라고 생각한다.

 

Visual Studio 같은 IDE 에서는 else 문으로 써도 프로그램이 정상적으로 작동하지만,

꼭 return 으로 써주도록 하자.

728x90