Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
Tags
- map
- list
- 기술면접
- 해쉬맵
- 벡터
- 인프런
- 공부
- c#
- MonoBehaviour
- 힙영역
- 큐
- std::map
- 멀티쓰레드
- Queue
- 스택
- 트리
- 객체지향
- 반복문
- 차이점
- std::unordered_map
- 프래그멘테이션
- 알고리즘
- 리스트
- 배열
- thread
- 스택영역
- static_cast
- vector
- rookiss
- 자료구조
Archives
- Today
- Total
호빵의 IT 개발소
재귀 호출의 장단점 본문
재귀함수
- 하나의 함수에서 자신을 다시 호출 하여 작업을 수행하는 방식으로, 주어진 문제를 푸는 방법입니다.
재귀함수 사용
- 피보나치 수열
- 팩토리얼 연산
// 피보나치
private int Fibonacci(int n)
{
if (0 == n)
{
return 0;
}
if (1 == n)
{
return 1;
}
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
// 팩토리얼
private int factorial(int n)
{
if(n == 1)
{
return 1;
}
return n * factorial(n - 1);
}
재귀함수의 장점
- 이해하기 쉬움
- 쉽게 프로그래밍 가능
- 변수 사용을 줄여줌
재귀함수의 단점
- 시간 복잡도가 반복문에 비해 계산이 어려움
- 반복문보다 큰 오버헤드를 가짐(메모리 사용량이 많고 수행 시간이 더 길어질 수 있음)
- 함수 호출을 많이 하기에 StackOverFlow 가능성
- 종결조건이 A 측면, B측면에서도 확실해야 한다. 글렇지 않으면 무한 반복 발생
- 무한 반복이 일어나면 CPU 크래쉬 발생
꼬리재귀
- 재귀호출의 단점을 극복
- 일반 재귀함수는 추가 연산이 존재, 반면 꼬리재귀는 함수가 두개로 분리되어있고 재귀 호출 이후 추가적인 연산을 요구하지 않도록 구현
- 콜 스택이 추가로 생성되지 않음
*컴파일러가 꼬리재귀최적화를 지원해 주어야 한다.(c++, c#에서는 꼬리재귀최적화를 지원)
꼬리재귀 피보나치의 수열
private int Fibonacci(int n)
{
return FiboTail(n, 0, 1);
}
private int FiboTail(int n, int previous, int next)
{
if (n == 0)
{
return previous;
}
else
{
return FiboTail(n - 1, next, previous + next);
}
}
꼬리재귀 팩토리얼
private int factorial(int n)
{
return factorialTail(n, 1);
}
private int factorialTail(int n, int acc)
{
if(n == 1)
{
return acc;
}
return factorialTail(n - 1, acc * n);
}
'CS(전공지식) > 프로그래밍언어' 카테고리의 다른 글
| [C/C #] ref, out 키워드 (0) | 2022.07.17 |
|---|---|
| 오버로딩, 오버라이딩 (0) | 2022.06.29 |
| [C] C프로그램(소스 파일, 목적 파일, 실행 파일) (0) | 2022.06.26 |
| [C] 포인터 (0) | 2022.06.24 |
| [C/C#] 업캐스팅, 다운캐스팅 (0) | 2022.06.23 |
Comments