seegongsik
프로그래밍

어떻게 자기를 부르는 함수, 재귀

함수는 다른 함수를 부를 수 있다고 했다(9강). 그렇다면 함수가 자기 자신을 부르면 어떤 일이 벌어질까? 거울 두 개를 마주 세운 것처럼, 안에 똑같은 것이 끝없이 들어 있게 돼요.

01

자기를 부르는 함수

9강에서 함수는 일을 묶어 이름 붙인 것이었고, 함수 안에서 다른 함수를 부를 수도 있었다.
재귀는 거기서 한 발 더 나간다. 함수가 자기 자신을 다시 부르는 것이다.
거울 안의 거울처럼 똑같은 것이 한 겹 더 생겨요.

깊이 0

한 겹 더를 누를 때마다 안쪽에 똑같은 틀이 한 겹씩 생긴다.

신기하지만 조금 무섭기도 하다.
이렇게 계속 자기를 부르면 영원히 멈추지 않는 것 아닐까?
맞다. 그래서 재귀에는 꼭 필요한 것이 하나 있어요.

02

멈출 곳이 있어야 한다

거울 두 개는 정말 끝없이 들어가지만 컴퓨터는 '영원히'를 할 수 없다.
그래서 '조각이 충분히 작아지면 거기서 멈춰라'라는 규칙을 하나 정한다.
이 멈춤 규칙이 없으면 끝없이 돌다가 무너져요.

3

멈춤 규칙을 켜면 3, 2, 1에서 딱 선다. 끄면 끝없이 내려가다 무너진다.

멈추는 자리를 '바닥'이라고 생각하면 쉽다.
바닥에 닿기 전까지는 자기를 계속 부르고, 바닥에 닿으면 더는 부르지 않는다.
그러면 이제 문제를 어떻게 쪼개느냐가 핵심이에요.

03

같은 문제의 더 작은 판

재귀의 진짜 비결은 큰 문제를 '한 걸음 + 똑같지만 더 작은 문제'로 보는 데 있다.
계단 전체 = 한 칸 + 나머지 계단이고, 나머지 계단도 한 칸 작을 뿐 똑같은 문제다.
작아지고 작아지다 0칸에 닿으면 끝나요.

남은 계단 5

한 칸 떼기를 누를 때마다 계단이 한 칸씩 준다. 남은 계단은 매번 '똑같지만 더 작은' 문제다.

어렵던 문제가 갑자기 쉬워진다.
전부를 한 번에 풀 필요 없이, '한 칸'만 처리하고 나머지는 똑같은 함수에 다시 맡기면 된다.
그런데 맡긴 일은 어떻게 돌아올까요?

04

갔다가 다시 돌아온다

재귀는 두 방향으로 움직인다.
먼저 자기를 부르고 또 부르며 바닥까지 쭉 내려간다.
바닥에 닿으면 이번에는 거꾸로 올라오면서 저마다 제 몫을 더한다.
접시를 쌓았다가 위에서부터 다시 치우는 것과 똑같아요.

sum(3)
내려가는 중

다음 단계를 누르면 1+2+3을 바닥까지 내려갔다가, 올라오며 6으로 모은다.

이 '내려갔다 올라오기'가 재귀의 심장이다.
내려갈 때는 문제를 쪼개고, 올라올 때는 답을 합친다.
쌓인 일들이 바닥에서부터 차례로 풀려요.

05

반복의 형제, 그리고 그 너머

재귀와 반복(7강)은 형제다.
둘 다 같은 일을 여러 번 하지만, 반복은 옆으로 죽 늘어놓고 재귀는 안으로 한 겹씩 파고든다.
폴더 안의 폴더처럼 가지에서 또 가지가 나는 일에는 재귀가 딱 맞아요.

깊이 1

누를 때마다 가지가 또 갈라진다. 같은 규칙이 스스로 나무를 그린다.

일을 묶어 이름 붙인 함수가(9강) 이제 자기 자신까지 부를 수 있게 되었다.
작게 쪼개고, 바닥에서 멈추고, 다시 모으는 이 한 가지 생각이 폴더, 댓글의 댓글, 미로 찾기까지 풀어낸다.
다음 레슨에서는 여러 값을 짝지어 담는 법으로 넘어가요.

한 줄 정리재귀는 함수가 자기 자신을 부르는 것이다. 큰 문제를 '같은 문제의 더 작은 판'으로 쪼개고, 멈출 곳에 닿으면 다시 거슬러 올라오며 답을 모아요.
← 프로그래밍
이 페이지가 도움 됐다면 후원하기