본문 바로가기

[TIL] 재귀 호출

인포꿀팁 발행일 : 2020-08-04

재귀 호출이란?

메소드 내에서 메소드 자기 자신을 호출하는 방식

특징:

  • 코드가 간결하며 오류 수정이 용이하다.
  • 실행시간 관점에서 처리속도가 반복문보다 비효율적이다.
  • 하나 이상의 종료 조건을 사용하여 재귀 호출을 종료 하도록 해야한다.
  • 모든 재귀 호출은 원 문제를 부분 문제로 줄여가면서 종료 조건이 될 때 까지 반복한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package ex0804;
 
public class RecursiveCall_Ex2 {
 
    public static void main(String[] args) {
        User7 ob = new User7();
        int s;
        s = ob.sum(10);
        System.out.println(s);
    }
 
}
// 재귀 호출을 활용하여 입력한 숫자까지의 정수의 합
// 단점 : 속도가 상대적으로 느리다.(제어문,반복문 보다 느림)
class User7 {
    public int sum(int n) {
        return n > 1 ? sum(n - 1+ n : 1;
        
        //10+sum(9)
        //10+9+sum(8)
        //10+9+8+sum(7)
        //..
        //10+9+8+7+6..+sum(1)
    }
}
 
cs

 

 

무한 반복되는 재귀 호출

함수 호출은 메모리의 stack영역을 사용하므로 무한 반복되는 재귀 호출은 StackOverflowError를 유발한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package ex0804;
 
public class RecursiveCall_Ex3 {
 
    public static void main(String[] args) {
        User8 u = new User8();
        u.print(5); 
        // 컴파일오류 : 스택 오버플로우 
        // 스택 공간이 넘치면 StackOverflowError가 발생하고 프로그램 종료
        // 스택 메모리 공간은 한정적임.
    }
}
 
class User8 {
    public void print(int n) {
        System.out.println("start:"+n);
        print(n-1);
        System.out.println("end:"+n);
    }
}
cs

 

'Language > JAVA' 카테고리의 다른 글

[TIL] this , this()  (0) 2020.08.04
[TIL] 비정형 인자 (가변 인수)  (0) 2020.08.04
[TIL] 메소드 오버로딩  (0) 2020.08.03
[TIL]클래스의 활용  (0) 2020.08.03
[TIL]메소드  (0) 2020.07.31

댓글