공부기록/자료구조
재귀 알고리즘 _ 하노이 타워 문제
lecor
2020. 12. 8. 19:48
'윤성우의 열혈 자료구조'의 Ch.2 재귀(Recursion)를 보면서 요약한 내용입니다.
재귀 알고리즘에서는 다음 두 가지를 잘 생각해야 한다.
1. 재귀의 탈출 조건
2. 반복되는 패턴
[EX 1] 팩토리얼 구하기
👇 소스코드
더보기
#include <stdio.h>
int recursive_factorial(int nb)
{
if (nb <= 0)
return (1);
return (nb * recursive_factorial(nb - 1));
}
int main(void)
{
int nb;
nb = 6;
printf("%d! = %d\n", nb, recursive_factorial(nb));
}
[EX 2] 피보나치 수열 구하기
👇 소스코드
더보기
#include <stdio.h>
int fibonacci(int index)
{
if (index == 1)
return (0);
else if (index == 2)
return (1);
else
return (fibonacci(n-1) + fibonacci(n-2));
}
int main(void)
{
int i;
for(i = 1; i < 15; i++)
printf("%d ", fibonacci(i));
return (0);
}
[EX 3] 하노이 타워
하노이 타워는 재귀의 반복 패턴을 찾는 것이 간단하지 않다.
원반이 3개인 하노이타워 문제는 위와 같이 7개의 단계를 거쳐 풀 수 있다.
그림을 보면서 패턴을 찾아보자.
원반 1, 2, 3을 C로 옮기는 문제를 해결하려면,
원반 1, 2를 B로 먼저 옮겨야함을 알 수 있다.
그다음, 3을 C로 옮기고,
1, 2를 다시 C로 옮겨야 한다.
마찬가지로 원반이 4개라면, 원반 1,2,3 을 먼저 B로 옮기고 4를 C로 옮긴 뒤, 1,2,3 을 C로 옮겨야 한다.
🚩 패턴을 일반화하면
n 개의 원반을 A에서 C로 옮길 때,
- 원반 n - 1 개를 A에서 B로 이동
- 큰 원반을 A에서 C로 이동
- 원반 n - 1 개를 B에서 C로 이동
🚩 종료조건은 옮길 원반이 1개일 때이다.
소스코드
#include <stdio.h>
void HanoiTower(int num, char from, char by, char to)
{
if (num == 1)
{
printf("원반 1을 %c에서 %c로 이동\n", from, to);
}
else
{
// Move n - 1 number of disks from A to B
HanoiTower(num - 1, from, to, by);
// Move the disk n from A to C
printf("원반 %d를 %c에서 %c로 이동\n", num, from, to);
// Move n - 1 number of disks from B to C
HanoiTower(num - 1, by, from, to);
}
}
int main()
{
// Move 3 number of disks from A to C
HanoiTower(3, 'A', 'B', 'C');
return (0);
}