在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裏,一塊黃銅板上插着三根寶石
針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的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。