-
재귀 함수(DFS)코딩테스트/DFS&BFS 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
'코딩테스트 > DFS&BFS' 카테고리의 다른 글
JAVA 피보나치 수열 (배열 vs 재귀 함수 ) (0) 2022.05.30