#include<stdio.h>
void hanoi(int n, int a, int b, int c);
int main() {
hanoi(3,'a','b','c'); // [0] 최초 호출
}
void hanoi(int n, int a, int b, int c) {
if(n==1)
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
else {
hanoi(n-1,a,c,b);
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
hanoi(n-1,b,a,c);
}
}
==================================================================
[0] 가장 먼저 호출한 hanoi(3, 'a', 'b', c')는 아래에 나옵니다.
..................... 3 'a' 'b' 'c'
void hanoi(int n, int a, int b, int c) {
if(n==1)
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
else {
hanoi(n-1,a,c,b); //[1] 이 부분을 호출합니다.
// [7] 이 곳은 hanoi(3,...) 속입니다.
// 따라서 a에서 3의 원반을 c로 이동한다. [출력]이 됩니다.
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
// [8] 이제 다음 부분을 호출합니다. 즉 hanoi(2,...)를 호출하게 됩니다.
hanoi(n-1,b,a,c);
// [최종끝]
}
}
[1] 아직 위의 hanoi(3,...) 이 진행되고 있는 도중에
다음의 hanoi(2,...) 함수가 실행이 됩니다.
.....................2 'a' 'c' 'b'
void hanoi(int n, int a, int b, int c) {
if(n==1)
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
else {
hanoi(n-1,a,c,b); // [2] 다음으로 이 부분을 호출합니다.
// [4] 이곳은 hanoi(2,...) 속입니다.
// 따라서 a에서 2의 원반을 b로 이동한다. [출력]이 됩니다.
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
// [5] 이제 다음 부분을 호출합니다. 즉 hanoi(1,....)을 호출하게 됩니다.
hanoi(n-1,b,a,c);
// [**] 이 함수의 끝부분에 도착하면 이 함수가 끝이 납니다.
// 이 함수가 끝이 나면 아직 진행중인 hanoi(3,...)함수의 다음 문인
// [7] printf문을 실행하게 됩니다.
}
}
[2] 아직 위의 hanoi(2,...) 이 진행되고 있는 도중에
다음의 hanoi(1,...) 함수가 실행이 됩니다.
.....................1 'a' 'b' 'c'
void hanoi(int n, int a, int b, int c) {
if(n==1) // [3] n의 값이 1이므로 바로아래 printf문을 실행합니다.
.................a에서 1의 원반을 c로 이동한다. [출력]
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
........이제 hanoi(1,...) 함수가 끝이 나서
........ 아직 진행중인 hanoi(2,....)함수의
........ 다음 문인 [4] printf문을 실행하게 됩니다.
else {
hanoi(n-1,a,c,b);
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
hanoi(n-1,b,a,c);
}
}
[5] 아직 위의 hanoi(2...)가 진행되고 있는 중에
다음의 hanoi(1,...) 함수가 실행이 됩니다.
.................... 1 'c' 'a' 'b'
void hanoi(int n, int a, int b, int c) {
if(n==1) // [6] n의 값이 1이므로 바로아래 printf문을 실행합니다.
.................c에서 1의 원반을 b로 이동한다. [출력]]
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
......... 이제 hanoi(1,...) 함수가 끝이 나서
......... 아직 진행중인 hanoi(2,...)함수의 끝부분 [**] 으로 되돌아 가게 됩니다.
else {
hanoi(n-1,a,c,b);
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
hanoi(n-1,b,a,c);
}
}
[8] 아직 위의 hanoi(3,....)이 진행되고 있는 도중에
다음의 hanoi(2,....) 함수가 실행이 됩니다.
.....................2 'b' 'a' 'c'
void hanoi(int n, int a, int b, int c) {
if(n==1)
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
else { // [9] 다음에는 아래부분이 호출리 됩니다.
hanoi(n-1,a,c,b);
// [11] 이곳은 hanoi(2,...) 속입니다.
// 따라서 b에서 2의 원반을 c로 이동한다. [출력]이 됩니다.
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
// [12] 이제 다음 부분을 호출합니다. 즉 hanoi(1,....)을 호출하게 됩니다.
hanoi(n-1,b,a,c);
// [##] 이 함수의 끝부분에 도착하면 이 함수가 끝이 납니다.
// 이 함수가 끝이 나면 아직 진행중인 hanoi(3,...)함수의 끝부분[최종끝]에 도착해서
// 모두가 끝이 납니다.
}
}
[9] 아직 위의 hanoi(2...)가 진행되고 있는 중에
다음의 hanoi(1,...) 함수가 실행이 됩니다.
.................... 1 'b' 'c' 'a'
void hanoi(int n, int a, int b, int c) {
if(n==1) // [10] n의 값이 1이므로 바로아래 printf문을 실행합니다.
.................b에서 1의 원반을 a로 이동한다. [출력]]
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
........ 이제 hanoi(1,...) 함수가 끝이 나서
........ 아직 진행중인 hanoi(2,....)함수의
........ 다음 문인 [11] printf문을 실행하게 됩니다.
else {
hanoi(n-1,a,c,b);
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
hanoi(n-1,b,a,c);
}
}
[12] 아직 위의 hanoi(2...)가 진행되고 있는 중에
다음의 hanoi(1,...) 함수가 실행이 됩니다.
.................... 1 'a' 'b' 'c'
void hanoi(int n, int a, int b, int c) {
if(n==1) // [13] n의 값이 1이므로 바로아래 printf문을 실행합니다.
.................a에서 1의 원반을 c로 이동한다. [출력]]
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
......... 이제 hanoi(1,...) 함수가 끝이 나서
......... 아직 진행중인 hanoi(2,...)함수의 끝부분 [##] 으로 되돌아 가게 됩니다.
else {
hanoi(n-1,a,c,b);
printf("%c에서 %d의 원반을 %c로 이동한다.\n",a,n,c);
hanoi(n-1,b,a,c);
}
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
문자열안의 문자정렬 (0) | 2014.04.02 |
---|---|
while문 1개로 짠 골뱅이(달팽이) 배열 (0) | 2014.03.31 |
큰 정수의 제곱근의 정수값 구하기(정수연산 만으로) (0) | 2014.03.24 |
파스칼의 삼각형(2차원 배열) (0) | 2014.03.21 |
vc++ 2013 scanf오류 (0) | 2014.03.17 |