이 글에서는 아래 문제 상황에 대한 해결 방법을 알아보겠습니다.
문제 정의
두 개의 숫자 N과 K가 주어졌을 때, N이 0보다 큰 동안에는 N에서 K를 계속 빼고, N이 0 이하가 되면 다시 K를 더해가며 원래 숫자 N에 도달할 때까지 진행하는 것이 목표입니다.
예시
N = 10
K = 4
출력 결과
10 6 2 -2 2 6 10
알고리즘 접근 방식
- 재귀 함수를 반복적으로 호출하면서 N이 0보다 클 때까지 매 호출마다 K를 뺍니다.
- 숫자가 0 이하가 되면, 이번에는 원래 값에 도달할 때까지 매 호출마다 K를 더합니다.
- 여기서는 하나의 함수로 덧셈과 뺄셈을 모두 처리하며, 두 연산 사이의 전환은 불리언(Boolean) 타입 변수인 flag를 사용해 제어합니다.
핵심 로직 설명
flag 변수는 현재 수행 중인 연산의 방향을 나타냅니다. flag가 True일 때는 감소 단계(뺄셈), False일 때는 증가 단계(덧셈)를 의미합니다. 재귀 호출 과정에서 N이 0 이하로 떨어지는 순간 flag 값을 뒤집어 연산 방향을 전환하고, N이 원래 값으로 돌아오면 재귀를 종료합니다.
Python 구현 예제
def PrintNumber(N, Original, K, flag):
# 현재 숫자 출력
print(N, end = " ")
# 숫자가 0 이하가 되면 flag 값 전환
if (N <= 0):
if(flag==0):
flag = 1
else:
flag = 0
# 원래 값에 도달하면 재귀 종료
if (N == Original and (not(flag))):
return
# flag가 True면 K를 뺌
if (flag == True):
PrintNumber(N - K, Original, K, flag)
return
# flag가 False면 K를 더함
if (not(flag)):
PrintNumber(N + K, Original, K, flag)
return
N = 10
K = 4
PrintNumber(N, N, K, True)
실행 결과
10 6 2 -2 2 6 10
위 코드에서 모든 변수는 전역 네임스페이스(global namespace)에 선언되어 있으며, 함수 내부에서 이를 참조하여 재귀적으로 시퀀스를 생성합니다.
동작 흐름 요약
- 초기 호출에서 N=10, flag=True이므로 10 → 6 → 2 → -2 순서로 K씩 감소합니다.
- N이 -2가 되어 0 이하가 되자 flag가 False로 전환됩니다.
- 이후 -2 → 2 → 6 → 10 순서로 K씩 증가합니다.
- N이 원래 값 10에 도달하면 재귀 호출이 종료되어 프로그램이 완료됩니다.
결론
이 글에서는 Python 3.x 환경에서 for문이나 while문 같은 어떠한 반복문 구조도 사용하지 않고, 오직 재귀 함수와 불리언 플래그만으로 숫자 시퀀스를 출력하는 방법을 살펴보았습니다. 재귀 호출의 종료 조건을 명확히 설정하는 것이 무한 루프를 방지하는 핵심 포인트입니다.