하노이의 탑 문제는 재귀 문제로 해결할 수 있다.
원반이 하나도 없을때 종료할 수 있다.
원반이 한 개 있을 때, 우리는 Tower 1에 있는 원반 하나를 Tower 3를 옮기면 성공이다.
이는 다음과 같은 구조를 갖는다.
원반 N개 문제 ->큰 원반 1에서 3으로, 원반 N-1개 문제 ->큰 원반 1에서 3으로, 원반 N-2개 .... 원반 4개 -> 원반 3개 -> 큰 원반 1에서 3으로,원반 2개 -> 큰 원반 1에서 3으로-> break
def move_disk(disk_num, start_peg, end_peg):
print("%d번 원판을 %d번 기둥에서 %d번 기둥으로 이동" % (disk_num, start_peg, end_peg))
def hanoi(num_disks, start_peg, end_peg):
# base case: 옮길 원판이 없으면 부분 문제를 나누지 않고 함수를 끝낸다
if num_disks == 0:
return
else:
other_peg = 6 - start_peg - end_peg
# 1. 가장 큰 원판을 제외하고 나머지 원판들을 start_peg에서 other_peg로 이동
hanoi(num_disks - 1, start_peg, other_peg)
# 2. 가장 큰 원판을 start_peg에서 end_peg로 이동
move_disk(num_disks, start_peg, end_peg)
# 3. 나머지 원판들을 other_peg에서 end_peg로 이동
hanoi(num_disks - 1, other_peg, end_peg)