알아두면 좋은 재귀의 조건 3가지:
- 문제를 더 작은 하위 문제로 쪼갤 수 있는가?
- 하위 문제들이 원래 문제와 같은 구조인가?
- 종료 조건(base case)이 존재하는가?
n4가 to로 가면, 더 이상 신경 쓸 필요 없어진다.
즉, n의 처리 과정 중 일부를 n-1로 볼 수 있다. (주 문제를 동일한 유형의 Sub 문제를 사용해서 처리)
hanoi(n)은 n개의 원판을 옮긴다. 어떻게인지는 중요하지 않음.
(최소한 당장은, 나중에 base case로 해결할 것.- 믿음으로 가는거임.)
예시는 n=4에서 시작한다.
────────────────────────────────────────
[1]
[2]
[3]
[4] . .
────────────────────────────────────────
from temp to
────────────────────────────────────────
[1]
[2]
[4] [3] .
────────────────────────────────────────
from temp to
즉, 4만 목적지로 보내면 된다.
────────────────────────────────────────
[1]
[2]
. [3] [4]
────────────────────────────────────────
from temp to
여기서 4는 없어진다. (이미 원하는 위치에 존재하고, 나머지 블록을 위치시키는데 4를 신경쓰지 않아도 되므로)
temp와 from은 swap 가능하다. = hanoi(3) (하지만 문제 풀이를 위해선 to는 유지되어야 한다.)
즉 1,2,3이 남아 있고, 기둥 이름만 바뀐 채 다시 같은 문제를 푸는 것이다.
이제 hanoi(3): 1,2,3을 to로 옮겨야 한다.
먼저 hanoi(2): 1,2를 from으로.
────────────────────────────────────────
[1]
[2] . [4]
────────────────────────────────────────
from temp to
────────────────────────────────────────
[1] [3]
[2] . [4]
────────────────────────────────────────
from temp to
이제 hanoi(2): 1,2를 to로 옮겨야 한다.
먼저 hanoi(1): 1을 temp로.
────────────────────────────────────────
[3]
[2] [1] [4]
────────────────────────────────────────
from temp to
────────────────────────────────────────
[2]
[3]
. [1] [4]
────────────────────────────────────────
from temp to
이제 hanoi(1): 1을 to로.
Base Case — 1이 temp(=from 역할)에 있음.
────────────────────────────────────────
[2]
[3]
. [1] [4]
────────────────────────────────────────
(temp) (from) (to)
────────────────────────────────────────
[1]
[2]
[3]
. . [4]
────────────────────────────────────────
from temp to
Done!
화이트보드에 적힌 형태를 최대한 그대로 옮기면:
h(n, from_idx, to_idx)
h(n-1, from, temp)
move n to
h(n-1, temp, from)
문맥상 정리해서 쓰면:
h(n, from_idx, to_idx, temp_idx):
if n == 1:
move from_idx to to_idx
return
h(n-1, from_idx, temp_idx, to_idx)
move n to to_idx
h(n-1, temp_idx, to_idx, from_idx)
화이트보드 오른쪽 아래 내용 정리:
from에서n-1개를temp로 옮긴다- 그럼
to로n블록을 옮길 수 있다 - 이제
n블록은 해결됨(이미 옮겨졌으므로) - 이제
n-1을temp에서to로 옮긴다
base case는 n이 1일 때,
바로 from에서 to로 이동.
