본문 바로가기
Java/Java

메소드) 재귀 메소드 (Recurison)

by 박채니 2022. 3. 17.
SMALL

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


☞ 재귀 메소드(Recurison)

- 메소드 안에서 현재 메소드를 다시 호출하는 것

- 종료 조건을 반드시 명시해야 함

public class RecursionStudy {
	public static void main(String[] args) {
		RecursionStudy study = new RecursionStudy();
		study.test1(5);
	}
    
	//종료 조건 미설정	
	public void test1(int a) {
		System.out.println(a);
		test1(a-1);
	}
}

@콘솔출력값
Exception in thread "main" java.lang.StackOverflowError

이처럼 종료 조건을 설정하지 않으면 계속해서 test1메소드를 호출해오기 때문에 StackOverflowError가 발생합니다.

stack메모리에 계속해서 test1 메소드가 쌓이기 때문에 stack메모리를 초과해버린 것이죠.

 

따라서 반드시 재귀메소드 사용 시 종료 조건을 설정 해줘야 합니다.

public class RecursionStudy {
	public static void main(String[] args) {
		RecursionStudy study = new RecursionStudy();
		study.test1(5);
	}
	
	public void test1(int a) {
		//종료조건 설정
		if(a == 0)
			return;
		else {
			System.out.println(a);
			test1(a - 1);
		}	
	}
}

@콘솔출력값
5
4
3
2
1

이처럼 종료 조건을 설정하여 원하는 만큼 메소드를 호출할 수 있습니다.

따라서 반복문을 재귀 메소드로 처리할 수 있고, 재귀 메소드를 반복문으로 처리할 수 있습니다.

 

5! = 5 * 4 * 3 * 2 * 1

public class RecursionStudy {
	public static void main(String[] args) {
		RecursionStudy study = new RecursionStudy();
		int prod = study.factorial(5);
		System.out.println(prod);
	}
	
	public int factorial(int a) {
		if(a == 1)
			return 1;
		return a * factorial(a-1);
	}
}

@콘솔출력값
120

스택 메모리 공간

main에서 부터 차곡차곡 순서대로 호출 되었습니다.

factorial(5)를 호출하였을 때, 5*f(4)를 main함수에 리턴을 해줘야 하는데,  f(4)의 값을 모르니 리턴을 하지 못하게 됩니다.

따라서 다시 f(4)를 호출, 리턴을 하지 못하여 또 다시 f(3)을 호출 ... 과정을 거친 후 a의 값이 1이 되었을 때 1을 리턴해주게 됩니다.

 

스택 메모리 공간

a가 1이 되었을 때 1을 return 해주어 호출된 순서 반대방향으로 값들을 return해주게 되어 최종적으로 prod에는 5*4*3*2*1의 값인 120이 담겨 출력할 수 있었습니다.

LIST