JAVA - 재귀호출이란?(Recursive Call)
Java에서 메서드를 사용하다보면 메서드 내에서 자신의 메서드와 같은 형태의 메서드를 반복적으로 호출하는 경우가 있습니다. 특히, 수학적인 계산을 할 경우에 말이죠.
1. 재귀호출(Recursive Call)이란?
- 메서드 내에서 자기 자신을 반복적으로 호출하는 것
- 재귀호출은 반복문으로 바꿀 수 잇으며, 반복문보다성능이 나쁨
- 이해하기 쉽고 간결한 코드를 작성할 수 있음
- 재귀함수의 형태로 많이 사용됨.
 ▶ 재귀호출의 예
- 팩토리얼(!), 제곱, 트리운행, 폴더목록표시 등등 - 재귀호출에서 가장 많은 예제로 사용되는 팩토리얼(Factorial)을 구현하여 살펴보겠습니다. 
 ▶ 팩토리얼의 정규식
1
2
3
f(n) = n * f(n-1)
단, f(1) = 1
5! = 5 × 4 × 3 × 2 × 1 = 120
팩토리얼을 자바코드로 구현하면 아래와 같습니다.
1
2
3
4
5
6
7
8
9
10
11
public long factorial(int n) {
	long result = 0;
	if (n == 1) {
		result = 1;
	} else {
		result = n * factorial(n - 1);
	}
	return result;
}
 위의 코드에서 중요한 로직은
1
2
3
4
n = 1 이면,
	1 을 리턴하고,
n = 1 이 아니면,
	n * factorial(n-1) 입니다.
- 순서1 - n = 5 일 때, - factorial(5)가 호출 되고,- 5 = 1 이 아니므로 result = 5 * factorial(5-1); 가 됩니다. ( 5-1 = 4 ) - result = 5 * - factorial(4); 로 정리됩니다.
- 순서2 - factorial(4)가 호출 되면, - 4 = 1 이 아니므로 result = 5 * 4 * factorial(4-1); 가 됩니다. (4-1 = 3 ) - result = 5 * 4 * - factorial(3); 로 정리됩니다.
- 순서3 - factorial(3)이 호출 되면, - 3 = 1 이 아니므로 result = 5 * 4 * 3 * factorial(3-1); 가 됩니다. (3-1 = 2 ) - result = 5 * 4 * 3 * - factorial(2); 로 정리됩니다.
- 순서4 - factorial(2)가 호출 되면, - 2 = 1 이 아니므로 result = 5 * 4 * 3 * 2 * factorial(2-1); 가 됩니다. (2-1 = 1 ) - result = 5 * 4 * 3 * 2 * - factorial(1); 로 정리됩니다.
- 순서5 - 마지막으로 factorial(1) 이 호출 되고, - 1 = 1 이므로 1 이 리턴되어, - result = 5 * 4 * 3 * 2 * factorial(1); 은 result = 5 * 4 * 3 * 2 * 1; 로 정리됩니다. 
그래서 factorial(5)가 호출되면, result = 5 * 4 * 3 * 2 * 1 이 리턴되는 것입니다.
 위의 내용을 예제코드와 그림으로 살펴보겠습니다.
 ▶ 예제코드
Factorial.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
 * @file name : Factorial.java
 * @date : 2013. 8. 15.
 * @discription : 팩토리얼 클래스
 * @author Cremazer(cremazer@gmail.com)
 */
public class Factorial {
	public long factorial(int n) {
		long result = 0;
		if (n == 1) {
			result = 1;
		} else {
			result = n * factorial(n - 1);
		}
		return result;
	}
}
 FactorialTest.java
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * @file name : FactorialTest.java
 * @date : 2013. 8. 15.
 * @discription : 팩토리얼 테스트 클래스
 * @author Cremazer(cremazer@gmail.com)
 */
public class FactorialTest {
	public static void main(String[] args) {
		Factorial f = new Factorial();
		int n = 5;
		System.out.println(n + "! = " + f.factorial(n));
	}
}
 ▶ 결과
5! = 120
 펙토리얼을 테스트 하기 위해 main() 메서드에서 Factorial객체 f를 생성하여 f를 이용해 facltorial(int n)에 접근해 봤습니다.
이 과정을 그림으로 살펴보면 아래와 같음을 알 수 있습니다.
 ▶ 팩토리얼의 호출 원리













