순환을 알아 보기에 앞서서 순환과 반복은 다르다는 것을 알아두자!
순환 : 알고리즘이나 함수가 수행 도중에 자기 자신을 다시 호출하여 문제를 해결하는 기법
반복 : 말그대로 반복하여 문제를 해결하는 기법
순환
순환(recursion)이란 어떤 알고리즘이나 함수가 자기 자신을 호출하여 문제를 해결하는 프로그래밍 기법이다.
순환은 많은 문제들을 해결하는데 독특한 개념적인 프레임 워크를 제공한다.
본질적으로 순환적인 문제나 그러한 자료구조를 다루는 프로그램에 적합하다.
팩토리얼 문제가 가장 잘 알려진 순환 문제이다. 다음 코드를 살펴보자.
int factorial(int n)
{
if(n == 1) return 1;
else return (n * factorial(n - 1));
}
위 함수를 살펴보면 팩토리얼 이라는 함수 내부에서 자기 자신을 불러온다는 것을 알 수 있다.
이처럼 자기 자신을 불러오는 함수를 재귀함수(recursive function)이라고 한다.
더 나아가서 위 함수가 진행되는 순서를 살펴보자
int factorial(3)
{
if(n == 1) return 1;
else return (3 * factorial(3 - 1));
}
//-> factorial(2)를 호출한다.
int factorial(2)
{
if(n == 1) return 1;
else return (2 * factorial(2 - 1));
}
//-> factorial(1)을 호출한다.
int factorial(1)
{
if(n == 1) return 1; // 조건문이 참이므로 1을 return한다.
else return (n * factorial(n - 1));
}
이와 같이 factorial(3)에서 시작하여 factorial(2), factorial(1)을 순차적으로 호출하는 것을 알 수 있다
순환 호출의 내부적인 구현
main()에서 factorial(3)을 호출했을 때 시스템 스택을 확인해보면
다음과 같이 순환의 호출이 중첩될수록 시스템 스택에 활성 레코드들이 쌓이게 된다.
· 활성 레코드: 함수를 위한 시스템 스택에서의 공간
아직 스택에 대해 이해가 덜 되었다면 이 글을 다시 읽고 오자!
2021/01/11 - [Fundamental/Data Structure] - 스택
스택
일상생활을 하거나 게임을 할때 가끔가다가 '스택을 쌓는다.' 또는 '스택이 쌓였다.'라는 말을 하거나 듣는 경우가 종종 있다. 이 '스택'이라는 것은 무엇으로부터 나왔으며 정확한 개념이 무엇
various-data-analysis.tistory.com
순환의 알고리즘
recursive 함수는 자기 자신을 순환적으로 호출하는 함수이다.
만약 함수 내에 순환호출을 멈추는 부분이 없다면 시스템 스택을 다 사용할 때까지 순환적으로 호출되다가 결국 에러를 내면서 멈출 것이다. → 순환을 break 시켜주는 코드가 반드시 필요하다.
순환 ↔ 반복
반복문을 사용하면 일정한 횟수 동안 반복을 시키거나 어떤 조건에 만족될 때까지 걔속해서 반복시킬 수 있다. 많은 경우 이러한 반복 구조는 문제를 간결하고 효율적으로 해결할 수 있으며 우리가 익숙한 방식이다. 하지만 어떠한 경우에는 반복을 사용하면 할 수록 문제가 복잡해지는 경우가 있다. 이런 경우 순환이 매우 좋은 해결책이 될 수 있다.
다시 한번 말하지만 순환과 반복은 다른 개념이다.
순환의 원리
순환은 분할 정복(divide and conquer)을 사용한다.
· 분할 정복(divide and conquer): 주어진 문제를 저 작은 동일한 문제들로 분해하여 해결하는 방법
※ 순환 호출이 일어날 수록 문제의 크기가 작아진다
순환은 문제를 나누어 해결하는 분할 정복 방법을 사용한다.
분할 정복에 대해 자세하게 알고 싶다면 이 글을 읽어보자.
2021/01/18 - [Fundamental/Algorithm] - 분할 정복 알고리즘 (Divide-and-conquer)
분할 정복 알고리즘 (Divide-and-conquer)
필자는 분할 정복 알고리즘을 '협업'이라고 생각한다. 대학에서의 조별 과제부터 사회로 진출해 회사에 입사하여 하는 일까지 우리는 살면서 늘 협업을 하고 있다. 협업이라 하면 '서로 커뮤니
various-data-analysis.tistory.com
'Study Fundamental > Data Structure' 카테고리의 다른 글
리스트(list) (0) | 2021.02.02 |
---|---|
연결 리스트(linked list) (0) | 2021.01.28 |
큐와 덱(Queue-and-Deque) (0) | 2021.01.28 |
스택 (0) | 2021.01.11 |
배열 / Array (0) | 2021.01.06 |