9강 / 20강

재귀 — 거울 속의 거울

자기 자신을 부르는 함수, 그리고 그 밑을 받치는 스택

재귀 — 거울 속의 거울
재귀는 거울 마주 보기입니다. 멈추는 규칙이 없으면 끝없이 이어집니다.

러시아 인형 마트료시카를 열면 안에 똑같이 생긴 작은 인형이 있습니다. 그걸 또 열면 더 작은 인형이. 언젠가 더 이상 열리지 않는 가장 작은 인형이 나오면 끝나죠.

재귀(recursion)는 함수가 자기 자신을 부르는 것입니다. 왜 이런 이상한 짓을 할까요? 큰 문제를 같은 모양의 작은 문제로 줄일 수 있을 때, 코드가 놀랄 만큼 짧아지기 때문입니다.

🛑
멈춤 조건
가장 작은 인형 — 여기서 끝
🔽
줄이기
한 겹 작은 문제로
🔁
자기 호출
같은 함수를 다시
재귀의 뼈대: 멈춤 조건 + 자기 호출.
Python 브라우저에서 실행

🎮 콜 스택을 눈으로 보기

재귀 함수를 실행하면 부를 때마다 스택에 한 칸씩 쌓이고, 돌아올 때마다 한 칸씩 걷힙니다. 아래에서 한 걸음씩 눌러 보세요. 6강의 접시 더미가 그대로 나타납니다.

콜 스택 — 재귀가 쌓이고 걷히는 과정을 한 걸음씩 봅니다
불러오는 중…
쌓이는 순서와 걷히는 순서를 눈으로 확인합니다.
Python 브라우저에서 실행

재귀가 진짜 빛나는 순간 — 하노이 탑

원반 N개를 옮기는 문제입니다. 반복문으로 풀려면 머리가 아프지만, 재귀로 보면 세 줄이에요.

  1. 위의 N−1개를 보조 기둥으로 옮긴다 (같은 문제, 한 겹 작게)
  2. 가장 큰 원반을 목표 기둥으로 옮긴다
  3. 보조 기둥의 N−1개를 목표 기둥으로 옮긴다 (같은 문제, 한 겹 작게)
다섯 줄로 하노이 탑을 풉니다. 원반 수만 바꿔 보세요.
Python 브라우저에서 실행

재귀의 함정 — 같은 계산을 몇 번이나

피보나치 수열을 재귀로 쓰면 아름답지만, 끔찍하게 느립니다. 같은 값을 몇 번이고 다시 계산하기 때문이에요. 해결책은 계산한 값을 딕셔너리에 적어 두는 것입니다(5강!).

같은 답, 호출 횟수는 수천 배 차이. 숫자를 30, 32로 올려 보세요.
Python 브라우저에서 실행
🤔 확인 문제
재귀 함수에 반드시 있어야 하는 것은?
🤔 확인 문제
재귀 호출이 깊어질수록 무엇이 쌓이나요?
🤔 확인 문제
재귀 피보나치가 느린 이유는?