void func(..) {
	...
	func(..);
	...
}

재귀 호출하는 함수 Code01 을 작성 후 실행해보자.

public class Code01 {
	public static void main(String [] args) {
		func();
	}
	
	public static void func() {
		System.out.println("Hello...");
		func();
	}
}

→ 무한 루프에 빠지게 될 것. 그렇다면 Recursion 은 항상 무한루프에 빠질까?

꼭 그런 것은 아니다. 이는 우리가 Recursion 을 어떻게 작성하는지에 따라 무한루프에 빠지지 않고 우리가 원하는 일을 하도록 만들 수 있다.

public class Code02 {
	public static void main(String [] args) {
		int n = 4;
		func(n);
	}
	
	public static void func(int k) {
		if (k <= 0) 
			return;
		else {
			System.out.println("Hello..");
			func(k-1);
		}
	}
}

스크린샷 2025-04-04 오후 2.41.42.png

→ 이 함수는 저번 함수와 다르다. 이는 입력으로 어떠한 매개변수 k 가 주어지고 그 k 가 0 이하라면 더이상 자기자신을 호출하지 않은 채 그냥 리턴하고, 그렇지 않은 경우에만 Hello 를 입력하고 자기자신을 다시 호출한다. 이때 자신을 호출 시 자신이 받은 매개변수 k 를 그대로 넘겨주는 것이 아닌 k-1 을 매개변수로 넘어주는 형태.

그렇다면 Recursion 이 무한루프에 빠지지 않게 하기 위한 조건은 무엇일까?

예시를 몇 개 살펴보도록 하자.

public class Code01 {
	public static void main(String [] args) {
		int result = func(4);
		System.out.print(result);
	}
	
	public static int func(int n) {
		if (n <= 0)
			return 0;
		else {
			return n+func(n-1);
		}
	}
}

스크린샷 2025-04-04 오후 4.20.48.png

→ 결국이 func 란 함수는 자신이 입력을 받은 정수 n 에 대해 1까지 n 까지의 합을 구하는 작업을 수행