재귀(Recursion)
문제를 같은 모양의 더 작은 문제로 줄여 푸는 방법. 하노이의 탑(Tower of Hanoi)처럼, 가장 작은 경우와 '한 단계 줄이기'만 정하면 된다.
재귀는 문제를 같은 모양의 더 작은 문제로 바꾸어 푸는 방법입니다. 필요한 것은 두 가지뿐입니다. 더 쪼갤 필요 없이 바로 답할 수 있는 가장 작은 경우(기저 사례, base case)와, 큰 경우를 한 단계 작은 경우로 줄이는 규칙입니다. 나머지는 같은 규칙이 끝까지 알아서 해 줍니다. 수학적 귀납법(mathematical induction)을 거꾸로 쓰는 셈이라, 재귀가 옳게 동작한다는 증명도 대개 귀납법입니다.
1883년 프랑스의 수학자 에두아르 뤼카가 퍼뜨린 하노이의 탑이 가장 유명한 예입니다. 크기가 다른 원판 n장이 기둥 A에 큰 것부터 쌓여 있습니다. 한 번에 한 장씩 옮기되 작은 원판 위에 큰 원판을 올릴 수 없을 때, 전부 C로 옮기려면 어떻게 할까요? 재귀로 보면 간단합니다. 위의 n−1장을 (C를 거쳐) B로 옮기고, 가장 큰 원판을 C로 옮긴 뒤, B의 n−1장을 (A를 거쳐) C로 옮깁니다. 'n−1장 옮기기'를 어떻게 하는지는 같은 규칙이 다시 정해 줍니다.
원판
옮기는 횟수
컴퓨터는 재귀 호출을 할 때마다 '어디까지 했는지'를 호출 스택(call stack)에 쌓아 두었다가, 작은 문제가 끝나면 꺼내서 이어 갑니다. 위의 ›로 이은 줄이 바로 그 스택입니다. 기저 사례를 빠뜨리거나 규칙이 문제를 기저 사례 쪽으로 줄이지 못하면 호출이 끝없이 쌓입니다. 실제 컴퓨터에서는 스택(stack)이 넘쳐 프로그램이 오류로 멈춥니다. 같은 작은 문제를 여러 번 부르는 재귀는 금세 느려집니다. 피보나치 수
이어지는 곳. 유클리드 호제법(Euclidean algorithm)
이 개념이 나오는 긴 글
이 개념 위에 세워진 것
이 개념을 언급하는 페이지
- 최대공약수와 유클리드 호제법
… \gcd(34, 21) = \gcd(21, 13) 입니다. 문제를 같은 모양의 더 작은 문제로 줄이는재귀의 전형입니다. 흔히 최대공약수를 구하려면 소인수분해가 필요하다고 생각합니다. 학교에서 12 = 2² …
- 피보나치 수열
… 알고 있었습니다. 피보나치 수는 파스칼의 삼각형의 얕은 대각선을 더해도 나옵니다. 정의를 그대로 옮긴재귀프로그램은 같은 값을 거듭 다시 계산합니다. F_n 을 구하는 호출 수는 F_n 자신과 같은 속도, 곧 …
- 람다 계산
… 순서는 정규형이 있으면 반드시 찾아낸다는 것이 알려져 있습니다(표준화 정리). 이름 없는 함수로는 되부름(재귀)을 어떻게 할까요? 함수 g에 넣었을 때 그대로 돌아오는 값, 곧 g\,z = z 인 z를 g의 …
- 처치–튜링 논제
… 클리니⟧가 다듬은 재귀 함수가 있었습니다. 재귀 함수는 0과 '다음 수'에서 출발해 함수 합성, 되부름(재귀), '조건을 만족하는 가장 작은 수 찾기'만으로 만들어지는 자연수 함수입니다. 여기에 튜링의 ⟦튜링 …
- 문맥 자유 문법
… 촘스키와 쉬첸베르제). aⁿbⁿ을 만드는 규칙 S → aSb는 자기 자신을 다시 품습니다. 이 되풀이(재귀) 덕분에 문맥 자유 문법은 '열린 것은 반드시 닫힌다'는 중첩을 얼마든지 깊이 적을 수 있고, 바로 이 …
- 수학적 귀납법
… 항 하나가 앞의 여러 항으로 정해지는 점화식의 성질도 대개 이렇게 증명합니다. 프로그램과 귀납법.재귀는 귀납법을 거꾸로 돌린 것입니다. 프로그램이 가장 작은 경우를 옳게 풀고, 큰 경우의 답을 더 작은 …
- 점화식
… 피보나치 수열 a_n = F_{n+1} 이 됩니다. 작은 경우의 답으로 큰 경우의 답을 짓는 이 생각이재귀와 동적 계획법의 뿌리입니다. 아래는 a_n = p\,a_{n-1} + q\,a_{n-2} + c 꼴의 …
- 카탈랑 수
… 트리의 모양도 같은 이유로 C_n 가지입니다. 뿌리의 왼쪽 가지와 오른쪽 가지가 A와 B입니다(트리,재귀). 행렬 n+1개를 곱하는 순서(괄호 치는 방법)도 C_n 가지입니다. 이 수는 금세 너무 커지므로, …
- 알고리즘
… 곳. 알고리즘을 설계하는 대표적인 틀이 몇 가지 있습니다. 문제를 같은 모양의 더 작은 문제로 줄이는재귀, 반으로 나눠 각각 풀고 합치는 분할 정복, 겹쳐 나오는 작은 문제의 답을 표에 적어 두고 다시 쓰는 …
- 분할 정복
분할 정복은재귀의 한 형태입니다. 크기 n인 문제를 크기 n/2인 문제 몇 개로 나누고(분할), 각각을 같은 방법으로 푼 …
- 정렬 알고리즘
… 퀵정렬 은 기준 원소(피벗)를 하나 골라 그보다 작은 것은 왼쪽, 큰 것은 오른쪽으로 가른 뒤 양쪽을재귀로 정렬합니다. 여기서는 구간의 마지막 원소를 피벗으로 씁니다. 무작위로 섞인 입력에서는 평균 비교 횟수가 …
- 동적 계획법
재귀로 문제를 작은 문제로 쪼개다 보면 같은 작은 문제가 여러 번 다시 나오는 일이 많습니다. 피보나치 수 …
- 트리
… 폴더 구조처럼 위아래가 생깁니다. 뿌리 있는 트리는 '뿌리 하나와 그 아래 매달린 더 작은 트리들'이라는재귀적인 정의를 가지고, 그래서 트리 위의 계산은 대개 재귀로 짭니다. 자식이 많아야 둘이고 왼쪽 자식과 …
- 콜모고로프 복잡도
… 최적 답을 표에 채워 가는 동적 계획법으로 정확히 찾을 수 있고, 답은 되풀이 안에 되풀이가 든재귀적인 모양입니다. 문자열: . 비트를 눌러 뒤집어 보세요. 파란 칸이 1, 어두운 칸이 0입니다. 아래 …
- 게임 트리 탐색: 미니맥스와 몬테카를로 트리 탐색
… 다할 때의 결과이고, 그 값을 준 자식이 둘 수입니다. 이것이 미니맥스이며, 트리를 내려갔다 올라오는재귀로 짧게 적힙니다. v(n) = \max_{c}\, v(c)\ \ (n\text{: MAX}), …
- 대수적 자료형
… 구멍을 뚫는다는 것은 미분과 테일러 급수의 셈을 자료 구조에서 다시 보는 일입니다. 되부르는 타입은재귀로 처리하고, 그 되부름이 반드시 끝난다는 보장은 수학적 귀납법과 같은 원리에서 나옵니다. 타입 변수를 …
- 타입 추론: 힌들리–밀너
… 문법⟧으로 파싱해 얻고, 단일화는 두 나무를 겹쳐 맞추는 알고리즘이라, 발생 검사를 빼먹으면 나무에되부름하는 고리가 생겨 버립니다. 하위 타입이 끼어들면 같음의 방정식 대신 부등식 X\le Y 를 풀어야 해서 …
- 의존 타입
… 되부름이다. 자연수를 0과 succ(다음 수)로 짓고(페아노의 방식), 덧셈을 첫째 인자에 대한되부름으로 정의합니다: 0 + m = m , \mathrm{succ}\,k + m = …
- 영역 이론: 스콧과 재귀의 의미
… 1, 아니면 n · fact(n − 1). 식의 양쪽에 fact가 있으니 이것은 정의라기보다 방정식입니다.재귀를 처음 배울 때는 '같은 모양의 더 작은 문제로 줄인다'고 이해하고 넘어가지만, 방정식이라면 물어야 할 …
- F-대수와 fold: 재귀와 귀납의 범주론
… 모든 n이 P를 거쳐 가니 P = ℕ입니다. 곧 수학적 귀납법은 시작 대수의 '하나뿐'이 하는 말 이고,재귀로 정의하는 것은 시작 대수의 '있다'가 하는 말입니다. 목록에 대해서도 같은 논증으로 '빈 목록에서 …