Patrick's 데이터 세상

메소드의 재귀호출 본문

Programming/Java

메소드의 재귀호출

patrick610 2020. 6. 23. 00:25
반응형
SMALL

■ 재귀적 메소드

   자료구조와 알고리즘에서 자주 나오는 재귀(Recursion)이라는 개념은 수학적 계산식인 팩토리얼(Factorial)과 관련이 있습니다.

 ˙ 5! = 5 × 4 × 3 × 2 × 1
 ˙ 4! = 4 × 3 × 2 × 1
 ˙ 3! = 3 × 2 × 1
 ˙ 2! = 2 × 1
 ˙ 1! = 1

팩토리얼의 수학적 함수식

함수 f의 정의에 함수 f의 실행문이 삽입되어 있습니다.
마찬가지로 자바는 메소드의 재귀를 지원합니다.
즉, 메소드 f의 중괄호 부분에서 메소드 f의 호출 문이 삽입되는 것을 허용합니다.

 

class ReculFactorial
{
    public static void main(String[] args)
    {
    	System.out.println("3 factorial : " + factorial(3));
        System.out.println("12 factorial : " + factorial(12));
    }
    
    public static int factorial(int n)
    {
    	if(n==1)
        {
        	return
        }
        else
        {
        	return n*factorial(n-1);
        }
    }
}

· 실행결과

3 factorial : 6
12 factorial : 478001600

아직 실행이 완료되지 않은 메소드가 다시 호출하는 이유는 
메모리에 저장된 메소드를 구성하는 명령문이 CPU로 이동해서 실행이 되기 때문입니다.
메소드를 구성하는 명령문은 얼마든지 CPU로 이동해서 실행이 가능하므로, 기존에 호출된 메소드가 완료되지 않았다고 해서 호출이 불가능한 것은 아닙니다.
메소드의 앞 부분을 구성하는 명령문만 반복해서 CPU로 이동시킬 수 있기 때문입니다.


■ 잘못된 재귀 메소드 : 종료 조건이 없는 상황

class InfRecul
{
	public static void main(String[] args)
    {
    	showHi(3);
    }
    
    public static void showHi(int cnt)
    {
    	System.out.println("Hi~ ")
        showHi(cnt--);
        
        if(cnt==1)
        {
        	return;
        }
    }
}

위 예제의 showHi 메소드는 재귀에서 빠져나올 수 없습니다.
if(cnt==1)의 조건을 만족시킬 수 없기 때문입니다.

--연산자가 cnt 변수 뒤에 붙었기 때문에 showHi(cnt--); 메소드 호출을 통해서 인자(매개변수에 전달되는 값)가 전달되고 난 다음에야 비로소 cnt의 값이 하나 감소합니다.

showHi(3); 에서 전달된 값 3은 줄지 않고 계속해서 매개변수의 초기화 값으로 사용됩니다.

 · 재귀 연결 고리를 끊기 위한 조건 검사의 위치가 적절해야 합니다.
 · 재귀 연결 고리를 끊기 위한 조건 검사가 true가 되도록 적절한 연산이 이뤄져야 합니다.

 

반응형
LIST

'Programming > Java' 카테고리의 다른 글

자바 이름 생성 규칙(Naming Rule)  (0) 2020.06.23
클래스, 인스턴스  (0) 2020.06.23
method 메소드  (0) 2020.06.23
continue & break  (0) 2020.06.23
for, while 그리고 do~while  (0) 2020.06.21
Comments