코딩테스트/DFS&BFS

재귀 함수(DFS)

도비는자유에오 2022. 5. 30. 00:36

간단하게 설명하자면 자기가 자기자신을 호출하는 함수

 

문제) 

자연수 N입력 시 재귀함수를 사용하여 1~N까지 출력

 

풀이)

//재귀함수 - 깊이 우선 탐색
public class Main{
	//무한적으로 작동되므로 if~else로 멈추게 하기!
	public void DFS(int n) {
		if(n==0) {
			return;//void에서는 종료를 뜻함.
		}else {
			System.out.print(n + " ");
            DFS(n-1);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Main R = new Main();
		R.DFS(3);
	}
}

위 코드에 3을 입력 시 ,else 절에서 DFS메소드를 호출 시 값이 3 2 1 로 출력된다.

원하는 값은 1 2 3 이므로 소스를 아래와 같이 변경해야한다. 

줄만 서로 바꿨을 뿐인데 출력값의 정렬이 변경되었을까?

- 재귀함수는 Stack(LIFO) 프레임 구조를 사용하기 때문이다

 

간단하게 설명하자면 5번째 라인의 DFS(n-1) 이 실행되면 public void DFS를 다시 실행하게 되는 방식인데,

반복적으로 n이 0이 될때 까지 DFS의 위치를 stack에 저장해놓는다

DFS(3) -- 5번째 라인 >>>> DFS(2) -- 5번째 라인 >>>> DFS(1) -- 5번째 라인 이라고 저장해놓는다.

이렇게 저장 후 n=0이 되면 DFS라인 위치를 기억해놨다가 syso의 부분을 다시 실행시킨다.

Stack의 특성으로 가장 마지막으로 저장되었던  DFS(1) 라인부터 출력이 되는 것이다!

그러므로 1 2 3 으로 출력이 되는 것이다.

 

Stack Frame에 자세한 내용은 TCP School 사이트를 추천합니다.

http://www.tcpschool.com/c/c_memory_stackframe