Hanoi學習筆記

  漢諾塔學習,今天終於搞懂了漢諾塔的實現過程,說起來很麻煩,但是實現真的遞歸一下就是很簡單的事了。
  在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插着三根寶石
  針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所
  謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針
  上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就
  將在一聲霹靂中消滅,而梵塔、廟宇和衆生也都將同歸於盡。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=
  3,f(3)=7,且f(k+1)=2*f(k)+1 (f(k+1)可以理解爲現將k個金片全部移動到第三個針上面,然後再將最後的第k+1
  個金塊放到第二個針上面,然後再次利用三根針將三針上面的金片移動到二針上面),有遞歸表達式可以求得f(n)
  =2^n-1
  n=64時,
  f(64)= 2^64-1=18446744073709551615
  假如每秒鐘一次
#include <stdio.h>

void move(int n, int fromtower, int midtower, int totower)
{
    if (n == 1)
    {
        printf("step %d: move disk 1 from tower %d to tower %d.\n", count++, fromtower, totower);
    }
    else
    {
        move(n-1, fromtower, midtower, totower);
        printf("step %d: move disk %d from tower %d to tower %d.\n", count++, n, fromtower, totower);
        move(n-1, midtower, totower, fromtower);
    }
}

int main()
{
    int n;
    printf("Please input the number of disks:\n");
    scanf("%d", &n);
    move(n, 1, 3, 2);
    return 0;
}

,共需多長時間呢?一個平年365天有 31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下,
  18446744073709551615/31556952=584554049253.855年
  這表明移完這些金片需要5845億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。
真的過了5845億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅.
先我們肯定是把上面n-1個盤子移動到柱子C上,然後把最大的一塊放在B上,最後把C上的所有盤子移動到B上,
由此我們得出表達式:
  H(1) = 1
  H(n) = 2*H(n-1)+1 (n>1)

 public static void move(int number,int fromtower,int totower,int auxtower){
      if(number==1)
          System.out.println("Move disk 1 from the "+fromtower+" to the "+totower);
      else{
          move(number-1,fromtower,auxtower,totower);
          System.out.println("Move disk "+number+" from the "+fromtower+" to the "+totower);
          move(number-1, auxtower, totower, fromtower);
      }
 move(int num, int fromtower, int totower, int auxtower),是進行move的函數,可以這樣理解爲將num個盤子
 auxtower,從fromtower移動到totower,然後拆分問題,進行到將n-1個盤子從fromtower移動到totower,經過auxtower
 的輔助,然後將最後一個盤子移到totower上面,最後再將auxtower上面的盤子全部移動到totower上面藉助於fromtower。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章