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
'백준 알고리즘 단계별 풀이 (문제 수) > 재귀 함수 (5)' 카테고리의 다른 글
[C++] 별 찍기 - 10 : 2447번 (0) | 2022.07.12 |
---|---|
[C++] 재귀함수가 뭔가요? : 17478번 (0) | 2022.07.07 |
[C++] 피보나치 수 5 : 10870번 (0) | 2022.07.07 |