문제출처
https://www.acmicpc.net/problem/17478
문제분석
재귀함수의 구현을 연습하는 문제다. 입력값에 따라 문자열을 어떻게 출력하는 지의 로직을 짜야한다.
코드구현
n = int(input())
dashes = "____"
line0 = "어느 한 컴퓨터공학과 학생이 유명한 교수님을 찾아가 물었다.\n"
line1 = '"재귀함수가 뭔가요?"\n'
line2 = '"잘 들어보게. 옛날옛날 한 산 꼭대기에 이세상 모든 지식을 통달한 선인이 있었어.\n'
line3 = "마을 사람들은 모두 그 선인에게 수많은 질문을 했고, 모두 지혜롭게 대답해 주었지.\n"
line4 = '그의 답은 대부분 옳았다고 하네. 그런데 어느 날, 그 선인에게 한 선비가 찾아와서 물었어."\n'
line5 = '"재귀함수는 자기 자신을 호출하는 함수라네"\n'
line6 = "라고 답변하였지.\n"
my_lines = line0
m = n
def recursive(n):
global my_lines
my_dashes = (m - n) * dashes
my_lines += my_dashes + line1
if n > 0:
# 재귀호출 전 부분
my_lines += my_dashes + line2
my_lines += my_dashes + line3
my_lines += my_dashes + line4
# 재귀호출
recursive(n - 1)
else:
# 종료조건
my_lines += my_dashes + line5
# 반환 전 부분
my_lines += my_dashes + line6
return
recursive(n)
print(my_lines)
접근
출력결과를 분석한 후 데이터 처리를 3부분(재귀호출 전, 종료조건, 반환 전)으로 나눴다.
재귀 호출 전 부분
출력부분을 관찰하면 문자열들을 정의한 순서대로 언더바 길이가 증가하는 형태를 파악할 수 있다. 해당부분을 재귀호출 전 부분으로 정의했다.
종료조건
재귀호출 전 부분 이후에 처음으로 line5가 언더바와 함께 나타나는 부분을 관찰할 수 있다. 해당 부분을 종료조건 부분으로 정의했다.
재귀호출 후 반환 전 부분
재귀호출 전 부분과 반대로 언더바 길이가 줄어들듯이 출력되는 부분을 관찰할 수 있다. 해당부분은 재귀호출 후 반환 전 부분으로 정의하고 재귀함수를 구현했다.
회고
재귀함수와 관련 된 수업에서는 재귀호출이 되는 부분과 종료조건이 중요하다고 강조했었다. 하지만 실제로 구현해보니 재귀함수는 종료조건 뿐만 아니라 재귀호출 전후도 로직을 구조화하는 데에 고려했어야했다. 종료조건도 재귀함수의 종료라고만 받아들였을 뿐, 함수가 반환된다는 것과 연결되는 것을 문제를 풀면서 구현하는 것을 통해 알게 되었다.
정리
- 재귀함수는 종료조건 뿐만 아니라 재귀호출 전후도 로직을 고려해야한다.
- 종료조건은 함수의 반환과 연관된다.