재귀와 반복 (Recursion vs Iteration)
* 재귀 메소드
- 메소드는 특정한 문제를 해결하기 위해 다른 메소드를 호출할 수 있으며,
자신을 직접 호출하는 것을 재귀라고 한다.
- 재귀적인 방법을 사용함에 있어 주의할 점은 종료하는 지점을 정의하는 것이다.
그렇지 않으면 재귀는 무한 반복되기 때문이다.
* 재귀와 반복
- 재귀와 반복은 같은 문제를 해결하는 두가지 방법이지만, 재귀 방법이 적은 코드를 사용해 효율적으로 처리할 수 있다.
* 반복
- 메소드의 호출은 매개변수 리스트를 보관할 메모리 영역과
(메소드가 static이 아니라면) 메소드를 실행할 수 있는 복사 공간이 필요하다.
- 반복적인 메소드 호출을 위한 메모리는 한번만 필요하기 때문에 반복 프로그래밍이 성능적인 면에서 유리하다.
* 재귀
- 세련된 방법. 코드를 이해하고 유지하는 것이 더 중요하다면 재귀 프로그래밍을 고려한다.
- 메소드가 자신을 호출할 때에 메모리를 위한 비용과 CPU 사용 시간이 더 많이 소요된다.
* 예
팩토리얼 : 1부터 해당 숫자까지의 모든 숫자를 곱한 것.
// 반복적인 방법 public class FactorialIterative { public static void main (String[] args) { System.out.println ("5 factorial = " + factorial (5)); }
public static int factorial (int n) { int result = n; for (int i = n-1; i > 0; i--) { // 조건과 증가문을 위한 변수가 필요하다. result *= i; } return result; } } |
// 재귀적인 방법 public class FactorialRecursive { public static void main (String[] args) { System.out.println("5 factorial = " + factorial (5)); }
public static int factorial (int n) { if (n == 1) return 1; return n * factorial (n-1); } } |