
위 그림과 같이 엘레베이터에서 양옆에 거울이 있으면 이런식으로 보인다. 큰 거울 안에 작은 거울이, 그 안에 또 작은 거울이 있다. 하지만 실제로는 언젠가는 너무 작아져서 더 이상 볼 수 없게 되는 순간이 온다. 그게 재귀에서의 종료 조건(멈추는 지점)이다
재귀에서 가장 유명한 사용 예시는 바로 팩토리얼이다
팩토리얼이란 숫자들을 차례대로 곱한다. 예를 들어, 5! = 5 * 4 * 3 * 2 * 1 = 120 이렇게 된다. 이를 재귀로 쉽게 표현할 수 있다.
1! = 1 (1일 때는 결과가 그냥 1)n! = n * (n-1)! (n이 1보다 클 때는 자기 자신을 다시 호출)int factorial(int n) {
// 기저 조건: n이 1이면 1을 반환
if (n == 1) return 1;
// 재귀 호출: n * (n-1)!
return n * factorial(n - 1);
}
이것의 동작 방식은 다음과 같아요. 예를 들어, factorial(5)를 호출한다고 하면 다음과 같이 된다.
factorial(5)는 5 * factorial(4)를 계산하려고 함.factorial(4)는 4 * factorial(3)을 계산하려고 함.factorial(3)는 3 * factorial(2)을 계산하려고 함.factorial(2)는 2 * factorial(1)을 계산하려고 함.factorial(1)은 1이니까 더 이상 계산하지 않고, 이 값을 위로 전달함.5 * 4 * 3 * 2 * 1 = 120이 됨!재귀를 이용해서 퀵 정렬을 이용해보자.
#include <iostream>
#include <vector>
using namespace std;
void QuickSort(vector<int>& arr, int low, int high) {
if (low >= high) return;
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; j++) {
if (arr[j] < pivot) {
swap(arr[++i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
int pi = i + 1;
QuickSort(arr, low, pi - 1);
QuickSort(arr, pi + 1, high);
}
int main() {
vector<int> arr = {10, 7, 8, 9, 1, 5};
QuickSort(arr, 0, arr.size()-1);
for (int num : arr) cout << num << " ";
cout << endl;
return 0;
}


배열에 5, 3, 8, 4, 9, 1, 6, 2, 7이 저장되어 있다고 가정하고 자료를 오름차순으로 정렬해 보자.
퀵 정렬에서 피벗을 기준으로 두 개의 리스트로 나누는 과정(c언어 코드의 partition 함수의 내용)

피벗 값을 입력 리스트의 첫 번째 데이터로 하자. (다른 임의의 값이어도 상관없다.)
2개의 인덱스 변수(low, high)를 이용해서 리스트를 두 개의 부분 리스트로 나눈다.
1회전: 피벗이 5인 경우,
2회전: 피벗(1회전의 왼쪽 부분리스트의 첫 번째 데이터)이 1인 경우,
3회전: 피벗(1회전의 오른쪽 부분리스트의 첫 번째 데이터)이 9인 경우,