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
'Java > Java' 카테고리의 다른 글
this키워드(this.)와 this()메소드 (0) | 2022.03.17 |
---|---|
생성자) 기본 생성자, 파라미터 생성자, 생성자 오버로딩, this() (0) | 2022.03.17 |
메소드) call by value, call by reference (0) | 2022.03.17 |
메소드) 메소드 오버로딩, 메소드 시그니처란? (0) | 2022.03.17 |
메소드) 인스턴스 메소드, static 메소드 (0) | 2022.03.17 |