c·c++/c 프로그래밍

하노이탑 이해하기

바로이순간 2014. 3. 27. 12:55

#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);

  }

}