백준 문제 링크 : https://www.acmicpc.net/problem/17478
재귀함수는 자기 자신을 호출하는 함수이다.
코드는 https://yongku.tistory.com/entry/%EB%B0%B1%EC%A4%80-17478%EB%B2%88-%EC%9E%AC%EA%B7%80%ED%95%A8%EC%88%98%EA%B0%80-%EB%AD%94%EA%B0%80%EC%9A%94-%EC%9E%90%EB%B0%94Java
이 분의 블로그 코드를 참고했다.
import java.util.Scanner;
public class Main {
static String underbar ="";
public static void recur(int N) {
String line = underbar; // line == "" -------(2)
if(N==0) ------(3)
{
System.out.println(line+"\"재귀함수가 뭔가요?\"");
System.out.println(line+"\"재귀함수는 자기 자신을 호출하는 함수라네\"");
System.out.println(line+"라고 답변하였지.");
return; //종료조건 -----(9)
}
System.out.println(line+"\"재귀함수가 뭔가요?\""); //-----(4)(7)
System.out.println(line+"\"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.");
System.out.println(line+"마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.");
System.out.println(line+"그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어.\"");
underbar += "____"; //____를 더해간다. -------(5)
recur(N-1); //-------(6)(8)
System.out.println(line+"라고 답변하였지.");
return ; -----(10)
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
System.out.println("어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.");
recur(N); //----(1)
}
}
Main함수에서 N을 입력 받으면 입력받은 N을 recur함수로 넘겨준다.
처음 line은 "" 공백이다.
N이 0일때만 if문으로 간다. 0이 아닐경우 if문 밑의 문장들을 처리한다.
처음 이 문단을 실핼 할 때는 line이 공백이므로 ____ 없이 문장들을 출력한다.
underbar에 __ 을 더한다. 그러면 line이 __가 된다.
recur(N-1)을 실핼하여 다시 3번으로 간다. 똑같이 N이 0이 아닐경우 지나치고 0이면 실행한다.
이번에는 underbar에 __가 저장되어 있으므로 문장들 앞에 __ 를 붙여서 문장 출력을 한다.
만약 N이 0이 되었다면 if문으로 가게 된다. 그러면 if문에서는 7번에서 입력한 언더바보다 4개를 더 더해서 if문 안의 문장 앞에 붙이게 된다.
if문 문장끝에 return이 있으므로 재귀함수의 종료를 의미한다. 그러면 한단계전인 7번으로 돌아가서 if문의 언더바개수보다 4개 적은 단계가 된다.
9번단계가 끝난뒤에 다시 return까지 도달하게 되면 또 다시 전단계로 돌아가는 동작을 반복하여 언더바가 4개씩 줄어드는 동작을 실시한다. 결과적으로 언더바는 4번 단계처럼 공백이 된다.
재귀함수에서 return; 즉 void는 종료를 의미하며 그 전 단계로 돌아간다.