= Recursion =
{{tag>algorithm}}
= 기초 =
* 이해의 관점
* Heap 영역의 새로운 주소값을 갖는 **복사본** 함수를 생성한다!
* 가장 마지막에 호출된 함수가 가장 먼저 종료 된다! (**L**ast **I**n **F**irst **O**ut, Stack)
* 주의점!
* 반드시 __**탈출 조건**__이 있어야 한다.(= 탈출조건이 없으면 계속 복사본 함수를 만들어내어 값을 반환(Return)하지 못한다.)
== 예시 ==
#include
void Recursion(int num) {
//탈출 조건
if(num <= 0)
return;
//탈출 조건을 만들기 위한 인자(Argument)와 재귀 호출
Recursion(num-1);
printf("%2d번째 재귀 호출!\n", num);
}
void main() {
Recursion(3);
}
{{:algorithm:recursion2.jpg|}}
=== 해설 ===
* → 연쇄적 호출
* → 연쇄적 반환
{{ :algorithm:recursion1.jpg?nolink |}}
=== 결론 ===
* "연쇄적 호출 → 연쇄적 역반환"을 보이고 있다.
* 재귀함수 호출이 있으면 그 다음 코드는 그 시점에서 무시된다. (☞ printf()가 무시된 것에 주목!)
* "역반환"시에 출력되는 값이 자기 자신의 재귀함수에서 호출되는 매개변수(Parameter)값이다.
* 반환시 복사본 함수를 호출하여 값을 읽어오기 때문
= 예제 =
== 합 ==
public static int sum(int n) {
if(n <= 0)
return n;
return n + sum(n - 1);
}
== Factorial ==
private static int factorial(int n) {
if(n == 0) //0! = 1
return 1;
else
return n * factorial(n-1);
}
== Fibonacci Array ==
public static int fibonacci(int n) {
if(n < 1)
throw new StackOverflowError("1보다 커야 합니다.");
if(n == 1) {
return 0;
}
else if (n == 2) {
return 1;
}
else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
== Hanoi Tower ==
public static void hanoiTower(int n, String from, String to, String temp) {
if(n == 1) {
System.out.println(String.format("원반 %d개 %s → %s", n, from, temp));
}
else {
hanoiTower(n - 1, from, temp, to);
System.out.println(String.format("원반 %d개 %s → %s", n, from, temp));
hanoiTower(n - 1, temp, from, to);
}
}