當前位置:編程學習大全網 - 源碼下載 - 如何推導漢諾塔的公式

如何推導漢諾塔的公式

求汗諾塔N個盤子須幾次移動時得到了下面的遞推公式:

a[1] = 1;

a[n] = a[n-1] * 2 + 1;

請教通項公式?

a[1] = 1;

a[n] = a[n-1] * 2 + 1;

可得a[i]= 2^i-1;

證明,采用數學歸納法:

1、猜想a[i]= 2^i-1

2、當i=1時,顯然成立。

3、假設i=k時成立,即 a[k] = 2^k - 1;則:

由a[n] = a[n-1] * 2 - 1;得

a[k+1] = a[k] * 2 - 1

= 2^k * 2 - 1

= 2^(k-1) - 1

故得證。

同時::

漢諾塔問題(又稱河內塔問題)是根據壹個傳說形成的壹個問題:

有三根桿子A,B,C。A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C桿:

1. 每次只能移動壹個圓盤;

2. 大盤不能疊在小盤上面。

提示:可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須尊循上述兩條規則。

問:如何移?最少要移動多少次?

壹般取N=64。這樣,最少需移動264-1次。即如果壹秒鐘能移動壹塊圓盤,仍將需5845.54億年。目前按照宇宙大爆炸理論的推測,宇宙的年齡僅為137億年。

在真實玩具中,壹般N=8;這將需移動255次。如果N=10,需移動1023次。如果N=15,需移動32767次;這就是說,如果壹個人從3歲到99歲,每天移動壹塊圓盤,他僅能移動15塊。如果N=20,需移動1048575次,即超過了壹百萬次。

先看hanoi(1, one, two, three)的情況。這時直接將one柱上的壹個盤子搬到three柱上。註意,這裏one柱或three柱到底是A、B還是C並不重要,要記住的是函數第二個參數代表的柱上的壹個盤被搬到第四個參數代表的柱上。為方便,將這個動作記為:

one =》three

再看hanoi(2, one, two, three)的情況。考慮到hanoi(1)的情況已經分析過了,可知這時實際上將產生三個動作,分別是:

one =》two

one =》three

two =》three

很顯然,這實際上相當於將one柱上的兩個盤直接搬到three柱上。

再看hanoi(3, one, two, three)的情況。分析

hanoi(2, one , three, two)

one =》three

hanoi(2, two, one, three)

即:先將one柱上的兩個盤搬到two柱上,再將one柱上的壹個盤搬到three柱上,最後再將two柱上的兩個盤搬到three柱上。這不就等於將one柱上的三個盤直接搬到three柱上嗎?

運用歸納法可知,對任意n,

hanoi(n-1, one , three, two)

one =》three

hanoi(n-1, two, one, three)

就是先將one柱上的n-1個盤搬到two柱上,再將one柱上的壹個盤搬到three柱上,最後再將two柱上的n-1個盤搬到three柱上。這就是我們所需要的結果!

回答者:wuchenghua121 - 經理 四級 12-5 11:51

漢諾塔

漢諾塔(又稱河內塔)問題是印度的壹個古老的傳說。開天辟地的神勃拉瑪在壹個廟裏留下了三根金剛石的棒,第壹根上面套著64個圓的金片,最大的壹個在底下,其余壹個比壹個小,依次疊上去,廟裏的眾僧不倦地把它們壹個個地從這根棒搬到另壹根棒上,規定可利用中間的壹根棒作為幫助,但每次只能搬壹個,而且大的不能放在小的上面。解答結果請自己運行計算,程序見尾部。面對龐大的數字(移動圓片的次數)18446744073709551615,看來,眾僧們耗盡畢生精力也不可能完成金片的移動。

後來,這個傳說就演變為漢諾塔遊戲:

1.有三根桿子A,B,C。A桿上有若幹碟子

2.每次移動壹塊碟子,小的只能疊在大的上面

3.把所有碟子從A桿全部移到C桿上

經過研究發現,漢諾塔的破解很簡單,就是按照移動規則向壹個方向移動金片:

如3階漢諾塔的移動:A→C,A→B,C→B,A→C,B→A,B→C,A→C

此外,漢諾塔問題也是程序設計中的經典遞歸問題。

補充:漢諾塔的算法實現(c++)

#include <fstream>

#include <iostream>

using namespace std;

ofstream fout("out.txt");

void Move(int n,char x,char y)

{

fout<<"把"<<n<<"號從"<<x<<"挪動到"<<y<<endl;

}

void Hannoi(int n,char a,char b,char c)

{

if(n==1)

Move(1,a,c);

else

{

Hannoi(n-1,a,c,b);

Move(n,a,c);

Hannoi(n-1,b,a,c);

}

}

int main()

{

fout<<"以下是7層漢諾塔的解法:"<<endl;

Hannoi(7,'a','b','c');

fout.close();

cout<<"輸出完畢!"<<endl;

return 0;

}

C語言精簡算法

/* Copyrighter by SS7E */

#include<stdio.h> /* Copyrighter by SS7E */

void hanoi(int n,char A,char B,char C) /* Copyrighter by SS7E */

{

if(n==1)

{

printf("Move disk %d from %c to %c\n",n,A,C);

}

else

{

hanoi(n-1,A,C,B); /* Copyrighter by SS7E */

printf("Move disk %d from %c to %c\n",n,A,C);

hanoi(n-1,B,A,C); /* Copyrighter by SS7E */

}

}

main() /* Copyrighter by SS7E */

{

int n;

printf("請輸入數字n以解決n階漢諾塔問題:\n");

scanf("%d",&n);

hanoi(n,'A','B','C');

}/* Copyrighter by SS7E */

回答者: Vanquisher_ - 舉人 五級 12-5 13:57

parcel::::::::::

program hanoi;

functionhanoi(x:integer):longint;

begin

if x=1 then hanoi:=1;

if x=2 then hanoi:=3;

else

begin

hanoi:=2*hanoi(x-1)+1;

end;

end;

begin

read(x){第幾個數 }

write(hanoi(x));

end.

思想就是:第N個就等於第n-1個乘以2+1次

  • 上一篇:免費的炒股軟件有哪些?
  • 下一篇:怎麽學好web前端開發 ?
  • copyright 2024編程學習大全網