재귀 ( recursive ) 함수
알고리즘을 공부하려면 작성할 수 있어야 한다.
큰 문제를 반복 적용 가능한 작은 문제로 나워 푸는 방법이다. 즉, 어떤 함수가 매개변수만 바뀌어 자기 스스로를 호출하는 방식으로 구현
재귀가 필요한 알고리즘이 많음
- 이진 검색
- 트리 검색
- 퀵 정렬
- 그래프 알고리즘
재귀 함수의 장단점
장점 | 단점 |
가독성이 좋음 | 재귀적 문제 분석/설계가 안 직관적 |
코드가 짧음 | 맹목적인 믿음이 필요 |
각 단계의 변수 상태가 자동 저장됨 -> 함수의 스택 프레임 덕분 |
스택 오버플로 발생 가능 |
코드 검증도 쉬움 | 함수 호출에 따른 과부하 |
꼬리 호출
- 기존 재귀 함수를 보완하는 방식
- 함수 코드 제일 마지막에서 다른 함수를 호출하는 경우
- 그 후에 실행하는 명령어가 없음
꼬리 호출과 시택 프레임
- 스택 프레임이 존재하는 이유
- 함수에서 사용 중인 변수 값을 유지하기 위해
- 타 함수 호출 후 반환되면 스택에 저장했던 값을 되덜려 사용
- 꼬리 호출의 경우는 타 함수로 부터 반환 후 더 이상 연산이 없음
- 곧바로 호출자로 반환
- 따라서 스택 프레임에 저장해 놓은 변수 값을 재상용하지 않음
- 이러한 경우 컴파일러가 스택 프레임을 따로 안 마드는 최적화를 하기로 함
- 꼬리 호출 제거 ( tail call elimination)
- 꼬리 호출 최적화 (tail call optimization)
- 이러한 경우 컴파일러가 스택 프레임을 따로 안 마드는 최적화를 하기로 함
꼬리 재귀 (tail recursion)
- 꼬리 호출의 특수한 경우
- 마지막 에 호출하는 함수 ( 꼬리 호출) 가 자기 자신 (재귀)
- 꼬리 호출과 똑같은 최적화가 적용됨
꼬리 재귀 함수 작성하기
- 보통 꼬리 재귀 함수가 덜 직관적
- 그러나 이런 식으로 작성된 코드가 종종 보임
- 가장 큰 이유는 앞에서 말했던 최적화
꼬리 호출 최적화를 지원 안 하는 언어라면?
- 안 돼도 충분한 의미가 있음
- 꼬리 재귀는 반복문으로 쉽게 변경 가능
'프로그래밍 > 알고리즘' 카테고리의 다른 글
[알고리즘]05. 주먹구구식 알고리즘 (0) | 2022.12.15 |
---|---|
[알고리즘]03. 기초 자료 구조와 시간 복잡도 (0) | 2022.12.15 |
[알고리즘]02.점근 표기법 및 빅오 표기법 (0) | 2022.12.15 |
[알고리즘]01.알고리즘의 효율성 (0) | 2022.12.14 |
[알고리즘]00. 알고리즘 공부를 시작 하면서 (0) | 2022.12.14 |