알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
선수지식(algorithm)
간단한 예제를 통해 재귀함수와 스택 자료구조의 원리를 이해하고자 한다.
예제(Python)
답안
import sys
sys.stdin = open('AA/input_preknowledge.txt', 'rt')
def DFS(x):
if x > 0:
DFS(x-1)
print(x, end=' ')
if __name__ == "__main__":
n = int(input())
DFS(n)
# 출력 : 1 2 3
input_preknowledge.txt(입력)
3
중요내용
- 재귀함수는 자기자신을 호출하는 함수이다.
- 재귀함수가 작동하는 과정에서 스택 자료구조가 사용된다.
- 알고리즘 문제 풀이에서 재귀함수는 주로 반복문의 대체재로 사용된다.
- 위의 예제에서 if __name__ == "__main__" 안의 코드가 메인 코드이며, 해당 if절 밖의 코드가 재귀함수를 정의하는 코드이다.
참고내용(재귀함수 & 스택 자료구조 원리)
- 위의 예제에서 재귀함수의 매커니즘은 다음과 같다.
- 변수 n에 3이 입력되면, 해당 입력 값은 if절의 DFS(n) 함수에 인자로 들어간다. (즉, DFS(3)이 됨)
- DFS(3)이 호출되면 DFS() 함수의 정의대로 x가 0보다 클 때, DFS(x)에 들어온 인자(x)가 DFS(x-1)에 인자로 들어간다.
- 즉, DFS(x-1)에 들어간 3은 다시 DFS(2)를 호출하고 DFS() 함수의 정의에 따라 x가 0보다 클 때 다시 DFS(1)를 호출한다.
- 이러한 과정을 반복하면 DFS(0)까지 호출되고, 이 경우에는 if절의 조건을 충족시키지 못하므로(x = 0), 재귀함수는 중지된다.
- 위의 과정이 반복되는 동안 스택 자료구조에는 DFS(3), DFS(2), DFS(1), DFS(0)의 데이터가 순서대로 쌓이게 된다.
- DFS(n)의 데이터가 쌓일 때, 스택 자료구조에는 매개변수 x 값과 복귀주소가 포함된 스택 프레임이 만들어진다. (단, 지역변수가 존재하는 경우에는 스택 프레임 안에 지역변수도 함께 포함됨)
- 여기서 매개변수 x는 DFS() 함수의 인자로 들어온 값을 의미하며, 복귀주소는 해당 함수인 DFS()가 종료되면 복귀하게 되는 위치를 의미한다.
- 복귀주소는 DFS(x) 함수가 호출되기 직전의 위치로 기록된다.
- 예를 들면, DFS(3) 함수의 매개변수는 x = 3이고, 복귀주소는 if __name__ == "__main__" 안의 DFS(n) 코드가 작성된 위치이다.
- 다시 DFS(0)이 호출되는 시점으로 돌아가면, DFS(0)의 매개변수는 0이므로 if절의 조건이 충족되지 않아 재귀함수는 종료된다.
- 이렇게 재귀함수가 종료되는 시점에서 스태 자료구조에 쌓여있는 DFS(0)의 데이터는 삭제되고 파이썬은 DFS(0)의 복귀주소인 DFS(1) 코드가 위치한 곳으로 이동하여 그 다음 코드를 실행시킨다.
- 그 결과 DFS(1)의 다음 코드는 print(x, end=' ')이므로, x 값인 1이 출력되는 것이다. (DFS(1)의 매개변수가 1이기 때문)
- 1을 출력한 후에 재귀함수가 종료되면, 동일한 원리로 스택 자료구조의 DFS(1) 관련 데이터는 삭제되며 파이썬은 DFS(1)의 복귀위치로 이동하여 DFS(2)의 다음 코드인 print문을 실행시킨다. (print문으로 2가 출력되는 이유)
- 위의 과정을 반복하여 결국 1, 2, 3이 출력되고, 스택 자료구조에 쌓여있는 모든 데이터가 제거되어 재귀함수도 함께 종료된다.
'알고리즘' 카테고리의 다른 글
Algorithm - 이진트리 순회(DFS : Depth First Search) (0) | 2021.12.16 |
---|---|
Algorithm - 재귀함수를 활용한 이진수 출력 (0) | 2021.12.14 |
Algorithm - 최대힙 (0) | 2021.12.09 |
Algorithm - 최소힙 (0) | 2021.12.09 |
Algorithm - 아나그램(리스트 해쉬) (0) | 2021.12.07 |
댓글