Func(3)
-> Func(2)
-> Func(1)
-> Func(0) // base case
<- return
<- return
<- return
void Func(int a)
{
if (a <= 0) // base case
return;
std::cout << a << '\n';
Func(a - 1); // progress: a가 0에 가까워짐
}
실행 흐름(Func(3)):
3 출력 -> Func(2)2 출력 -> Func(1)1 출력 -> Func(0)a <= 0 조건으로 종료n! = n * (n-1)!0! = 1long long Factorial(int n)
{
if (n < 0)
return 0; // 입력 정책 예시: 음수는 0 반환(또는 예외)
if (n <= 1)
return 1;
return static_cast<long long>(n) * Factorial(n - 1);
}
Factorial(4))4 * F(3) -> 3 * F(2) -> 2 * F(1)F(1)=1 -> F(2)=2 -> F(3)=6 -> F(4)=24주의:
13!부터 int 초과).GCD(a, b) = GCD(b, a % b)b == 0이 되고, 그때의 a가 최대공약수입니다.예시:
GCD(1071, 1029)
= GCD(1029, 42)
= GCD(42, 21)
= GCD(21, 0)
= 21
int Gcd(int a, int b)
{
if (b == 0)
return a >= 0 ? a : -a; // 부호 정규화
return Gcd(b, a % b);
}
포인트:
직관 비유:
| 항목 | 핵심 |
|---|---|
| 기저 사례 누락 | 무한 호출 -> 스택 오버플로우 |
| 수렴 실패 | n-1 대신 n+1 같은 실수로 종료 불가 |
| 값 범위 | 팩토리얼 등은 오버플로우 주의 |
| 디버깅 | F11로 진입 + Call Stack 창으로 깊이/복귀 순서 확인 |
| 대안 선택 | 깊이가 매우 깊으면 반복문/명시적 스택을 고려 |
Factorial에서 오버플로우 위험을 줄이려면 어떤 타입/정책이 필요한가?