일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 개발
- FragmentPagerAdapter
- Android Universal Image Loader
- TabLayout and ViewPager
- overridePendingTraction
- 독서
- 재태크
- FragmentSatePagerAdapter
- 2020년 목표
- 목표한번이뤄보자
- FrameLayout
- 운동
- BottomNavigationViewEx
- Today
- Total
seops
3. 재귀함수 (보충자료 - 하노이 타워) 본문
자료구조 수업시간에 한 번은 꼭 해봤을 '하노이 타워'에 대한 리뷰를 하겠습니다.
(사실, 안하고 넘어갔는데... 막상 코딩해보려니깐 멘붕)
먼저, 하노이 타워의 동작 원리 뭔저 살펴보면 아래와 같습니다.
A B C
A에 있는 원반(1, 2, 3)을 C로 그대로 옮기는 방법을 구하는 문제입니다.
(단, 원반은 한 번에 하나씩만 옮길수 있고, 옮기는 고정에서 작은 원반의 위에 큰 원반이 올려져서는 안됩니다.)
간단히 n = 3일 경우를 생각해보겠습니다.
원반 |
이동 |
1 |
A -> C |
2 |
A -> B |
1 |
C -> B |
3 |
A -> C |
1 |
B -> A |
2 |
B -> C |
1 |
A -> C |
위 과정을 거치면, 기존 A에 위치했던 원반들이 모두 C로 그대로 옮겨짐을 확인할 수 있습니다.
One more time, 이번에는 n = 4일 경우를 생각해보겠습니다.
-> 원반 4(제일 밑)의 것을 A에서 C로 이동한 다음, 위에서 실행한 n=3인 경우를 해보겠습니다.
이를 통해, 하노이탑 문제 또한, 재귀함수를 이용한다는 것을 알 수 있습니다. 1) 재귀함수임을 인지했으니 이제 '종료 조건'을 알아보겠습니다.
2) 종료 조건
- 원반의 개수(n)가 1이면된다. 또한, 마지막으로 옮기는 원반은 제일 작은 원반(1)이므로 다음과 같이 표현할 수 있습니다.
if(n == 1)
System.out.printf("원반 1을 %c에서 %c로 이동", from, to);
3) 반복 패턴 코드화
- 제일 먼저, 나머지 원반을 A(from) -> B(by) 합니다.
- 다음으로, 제일 큰 원반을 A(from) -> C(to) 합니다.
- 끝으로, 첫번째의 나머지 원반을 B(by) -> C(to) 합니다.
void hanoi(int n, char from, char by, char to) {
.
.
.
else { // n != 1
hanoi(n-1, from, to, by);
System.out.printf("원반 %d를 %c에서 %c로 이동", n, from, to);
hanoi(n-1, by, from, to);
}
}
'알고리즘 스터디 (종료) > (수업) 자료구조' 카테고리의 다른 글
5. 정렬1(버블, 선택, 삽입) (0) | 2018.02.20 |
---|---|
4. 힙(Heap) (0) | 2018.02.20 |
3. 재귀 함수 (0) | 2018.01.18 |
2. 스택 / 큐 / 덱 / 문자열 (0) | 2018.01.09 |
1. 알고리즘 성능 분석 및 시간 복잡도 (0) | 2018.01.04 |