재귀 Recursive
어떤 사건이 자기 자신을 포함하고 다시 자기 자신을 사용하여 정의될 때 재귀적이라고 한다.
프로그래밍에서는 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 방식으로 주어진 문제를 푸는 방법을 뜻한다. 재귀 호출이나 되부름이라고 불리기도 한다.
팩토리얼 factorial
팩토리얼을 구하는 문제를 풀어보기 전에 팩토리얼의 개념이 가물가물한 문돌이, 문순이들은 이 단락을 읽어보도록 하자.
- 팩토리얼의 정의
간단하게 말해 수를 단계적으로 곱한다는 것이다. 계승이라고도 한다. - 사용
n! = 1 x (···) x n
- 예시
3! = 1 x 2 x 3 = 6
5! = 1 x 2 x 3 x 4 x 5 = 120
- 단, 0! 은 1로 약속한다.
팩토리얼을 이해하기 쉬운 링크 첨부
https://terms.naver.com/entry.nhn?cid=58600&docId=3547109&categoryId=59193
팩토리얼 이해하기
a, b, c 세 개의 문자를 한 줄로 세우는 데 몇 가지 방법이 있을까? 경우의 수를 생각해보자.
- a가 맨 앞에 오는 경우 : abc, acb
- b가 맨 앞에 오는 경우 : bac, bca
- c가 맨 앞에 오는 경우 : cab, cba
a, b, c 세 개의 문자를 한 줄로 세우는 방법은 총 6가지이다. 하지만 굳이 이렇게 하나하나 일렬로 늘어놓지 않고도 답을 구할 수 있다. 바로 팩토리얼이다.
- 맨 앞에 올 문자 3가지 (a, b, c) ••• 3
- 두번째 올 문자 2가지 (맨 앞 제외 두 가지 문자) ••• 2
- 세번째 올 문자 1가지 (맨 앞, 두 번째 제외 나머지 문자) ••• 1
3 * 2 * 1 = 6
⇒ 3!
팩토리얼 구하는 메서드 구현
팩토리얼을 구하는 메서드를 만드려면 두 가지 규칙만 잘 기억하면 된다. 그리고 이를 메서드로 구현하면 된다.
- 0! = 1
- n > 0 이면 n! = n * (n-1)!
static int factorial(int n) {
if (n > 0){
return n * factorial(n - 1);
} else {
return 1;
}
}
class Factorial {
static int factorial(int n) {
if (n > 0)
return n * factorial(n - 1);
else
return 1;
}
public static void main(String[] args) {
int x = 5; // 5! 구하기
System.out.println(x + "의 팩토리얼은 " + factorial(x) + "입니다.");
}
}
factorial 메서드 안에서 factorial메서드가 계속 해서 호출되는 이러한 형태를 재귀 호출(recursive call)이라고 한다.
factorial 함수에 5를 대입했을 때, 내부적으로는 5 * (4 * (3 * (2 * 1)))
와 같은 형태를 갖추고 있다. 따라서 5! 의 값은 120이라는 결과를 얻을 수 있다.
댓글