본문 바로가기

JAVA/DAY 13 _ 23.09.04

재귀함수

// 재귀 호출을 사용할 때는 항상 종료 조건을 명확하게 정의해야 함
--> 종료 조건을 제대로 정의하지 않으면 무한 재귀에 빠져서 프로그램이 정상적으로 동작하지 않을 수 있음

public int doProcess() {

    System.out.println("안녕!");
    // doProcess();				
    // (주석 떼면) 무한반복! 안녕출력, 다시 doProcess돌아가서 안녕출력..... exception!!!

    return 1;
}
package p4;

public class Main {

	public static void main(String[] args) {

		new Test().doProcess();
		new Test().doProcess(10);
		
		System.out.println("==여기부터==");
		 
		int sum = new Test().doProcess(3);
		System.out.println(sum);		//6

	}

}

public int doProcess(int value) {
	
    System.out.println("===============");

    if(value <= 0) {			
// Q. 왜 == 이 아니야?  / A.count가 0 또는 음수인 경우에도 종료되므로 보다 일반적인 상황에 사용할 수 있음!
// 주로, count 값이 특정 범위 내에 있을 때 재귀를 종료하려는 경우에 사용됨 (갑자기 1에서 -1로 넘어갈 수도 있잖아? )
        return 0;
    }

    System.out.println("반가워!");
    int sum = doProcess(value - 1); // 재귀 호출
    System.out.println(sum + "언제호출되냐");
    System.out.println(value + "이것이 value값");


    return sum + value;				
// doProcess 메서드가 재귀적으로 호출되면서 value를 감소시키고, 그 결과를 sum에 누적하게 됨
// ---> doProcess가 종료될 때 sum에는 value부터 1까지의 합이 계산되어 반환되는 것!!!!


}

// 예를 들어, doProcess(3)을 호출하는 경우:
//
// value는 3이므로 if (value <= 0) 조건이 충족되지 않습니다.
// "반가워!"가 출력되고, doProcess(value - 1)로 doProcess(2)를 호출합니다.
// doProcess(2)는 마찬가지로 doProcess(1)을 호출하고, doProcess(1)은 doProcess(0)을 호출합니다.
// ★★★ 재귀 호출은 이제 doProcess(0)부터 역순으로 종료 조건에 도달하게 됩니다. ★★★
//
// doProcess(0)에서는 value가 0이므로 종료 조건이 만족되고 0을 반환합니다.
// doProcess(1)은 sum에 0을 더하고, 1을 반환합니다.
// doProcess(2)는 sum에 1을 더하고, 3을 반환합니다.
// 마지막으로, doProcess(3)은 sum에 3을 더하고, 6을 반환합니다. 

// 따라서 doProcess(3)의 반환 값은 6이 됩니다.

 

 

 

## 좀 더 쉬운 함수

public int doProcess2(int value) {

    int sum = value;
    if(value <= 0) {
        return 0;
    }

    System.out.println("안녕");
    value--;
    System.out.println(value);
    sum += doProcess(value);
    System.out.println(value);
    return sum;


}

'JAVA > DAY 13 _ 23.09.04' 카테고리의 다른 글

Annotation  (0) 2023.09.11
folder  (0) 2023.09.11
Single Tone Pattern  (0) 2023.09.11
Final  (0) 2023.09.11
Static2  (0) 2023.09.11