漢諾塔(河內塔)算法 ----C語言遞歸實現


 漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,

在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。

   並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

 

漢諾塔的遞歸實現算法,將A中的圓盤借助B圓盤完全移動到C圓盤上,
每次只能移動一個圓盤,並且每次移動時大盤不能放在小盤上面
遞歸函數的偽算法為如下:
if(n == 1)
   直接將A柱子上的圓盤從A移動到C
else
   先將A柱子上的n-1個圓盤借助C柱子移動到B柱子上
   直接將A柱子上的第n個圓盤移動到C柱子上
   最后將B柱子上的n-1個圓盤借助A柱子移動到C柱子上
 
該遞歸算法的時間復雜度為O(2的n次方),當有n個圓盤時,需要移動圓盤2的n次方-1次
 
操作系統:ubuntu
編譯軟件:gcc
結果截圖:
 

 

 
 

我選擇了64個,運行了2分鍾還不到第10個。。。。。。。。。。。。。。。。。

 

 

 

  5 個的話,不到一眨眼的時間

 

 

 1 #include <stdio.h>
 2 
 3 
 4 //將n個圓盤從x柱子上借助y柱子移動到z柱子上
 5 void move(int n, char x, char y, char z)    
 6 {
 7      if(n == 1)
 8        printf("圓盤編號 %d :從 %c 移動到 %c\n",n,x,z);
 9      else
10      {
11     move(n-1,x,y,z);
12         printf("圓盤編號 %d:從 %c 移動到 %c\n",n,x,z);
13         move(n-1,y,x,z);
14      }
15 
16 }
17 
18 
19 int main()
20 {
21     //A,B,C分別代表三個柱子
22     char ch1 = 'A';
23     char ch2 = 'B';
24     char ch3 = 'C';
25 
26 
27     int n;   //n代表圓盤的個數
28     printf("請輸入圓盤的個數:");
29     scanf("%d",&n);
30     move(n,ch1,ch2,ch3);
31     
32     return 0;
33     
34 }

 

關於這個運行時間,,我也是醉了。。。。。。。。。。。。。。。。。。。。。。。。。。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM