Programming/Algorithm

[백준] 팩토리얼

Supreme_YS 2021. 10. 28. 19:34

1. 재귀함수란?

: 함수 내에서 자기 자신을(함수)를 계속적으로 호출하는 방식. 함수가 콜 되면서 최근에 자신을 부른 원래 함수가 스택에 차곡차곡 쌓이게 됨. 중요한건 처음 불려진 함수에서(스택 맨 밑에있는 메소드) return 되는 값이 최종 return 값이 된다.

 

2. 팩토리얼(Factorial)

: 1부터 특정 정수까지의 곱한 수

 

3. 재귀함수를 통한 팩토리얼 풀이

package Weekly;

import java.util.Scanner;

public class Factorial {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int userInputNum = input.nextInt();
        System.out.println(fact(userInputNum));
    }

    public static int fact(int n) {
        if (n <= 1) {
            return 1;
        }
        else {
            return fact(n-1) * n;
        }
    }
}

* userInputNum 변수에 사용자가 입력하는 숫자를 담을 변수를 선언

* fact 함수를 호출하여 userInputNum의 정수를 대입한다.

* fact 메서드를 보면, if 문을 통해 함수의 break를 걸어주고 있다. 팩토리얼 특성 상 0!, 1!은 똑같이 1이기 때문에  return 값을 1로 했다.

* else문에는 return 값을 자기 자신의 함수로 설정해놨는데 이 로직은 n 숫자에 fact(n-1)이 지속적으로 엮이는 chain 같다고 생각하면 조금 편하더라

 

예를 들어, userInputNum = 5 라고 하자. fact(5)가 실행이 되고 5 * fact(4)로 리턴한다. 이후, 5 * 4 * fact(3) 이고, 또 5 * 4 * 3 * fact(2) 가 되고. 기존 값들을 계속 리턴하면서 메모리에 누적시키고 if 조건문을 통해 break로 빠져나오게된다. fact가 if에서 설정한 숫자만큼 분열되는 느낌..(?) 이다.