9강 / 20강
재귀 — 거울 속의 거울
자기 자신을 부르는 함수, 그리고 그 밑을 받치는 스택
러시아 인형 마트료시카를 열면 안에 똑같이 생긴 작은 인형이 있습니다. 그걸 또 열면 더 작은 인형이. 언젠가 더 이상 열리지 않는 가장 작은 인형이 나오면 끝나죠.
재귀(recursion)는 함수가 자기 자신을 부르는 것입니다. 왜 이런 이상한 짓을 할까요? 큰 문제를 같은 모양의 작은 문제로 줄일 수 있을 때, 코드가 놀랄 만큼 짧아지기 때문입니다.
재귀의 뼈대: 멈춤 조건 + 자기 호출.
Python
브라우저에서 실행
🎮 콜 스택을 눈으로 보기
재귀 함수를 실행하면 부를 때마다 스택에 한 칸씩 쌓이고, 돌아올 때마다 한 칸씩 걷힙니다. 아래에서 한 걸음씩 눌러 보세요. 6강의 접시 더미가 그대로 나타납니다.
쌓이는 순서와 걷히는 순서를 눈으로 확인합니다.
Python
브라우저에서 실행
재귀가 진짜 빛나는 순간 — 하노이 탑
원반 N개를 옮기는 문제입니다. 반복문으로 풀려면 머리가 아프지만, 재귀로 보면 세 줄이에요.
- 위의 N−1개를 보조 기둥으로 옮긴다 (같은 문제, 한 겹 작게)
- 가장 큰 원반을 목표 기둥으로 옮긴다
- 보조 기둥의 N−1개를 목표 기둥으로 옮긴다 (같은 문제, 한 겹 작게)
다섯 줄로 하노이 탑을 풉니다. 원반 수만 바꿔 보세요.
Python
브라우저에서 실행
재귀의 함정 — 같은 계산을 몇 번이나
피보나치 수열을 재귀로 쓰면 아름답지만, 끔찍하게 느립니다. 같은 값을 몇 번이고 다시 계산하기 때문이에요. 해결책은 계산한 값을 딕셔너리에 적어 두는 것입니다(5강!).
같은 답, 호출 횟수는 수천 배 차이. 숫자를 30, 32로 올려 보세요.
Python
브라우저에서 실행
🤔 확인 문제
재귀 함수에 반드시 있어야 하는 것은?
해설 멈춤 조건이 없으면 끝없이 자기를 불러 RecursionError가 납니다. 그리고 매번 문제가 작아져야 그 조건에 닿을 수 있어요.
🤔 확인 문제
재귀 호출이 깊어질수록 무엇이 쌓이나요?
해설 함수를 부를 때마다 콜 스택에 한 칸이 쌓이고, 값을 돌려주면 걷힙니다. 파이썬이 약 1000겹에서 막는 이유가 바로 이 스택의 한계 때문이에요.
🤔 확인 문제
재귀 피보나치가 느린 이유는?
해설
피보(5)를 구하려고 피보(3)을 두 번, 피보(2)를 세 번… 계산합니다. 계산한 답을 딕셔너리에 적어 두면 호출 횟수가 수천 배 줄어요.