用遞迴思想解決漢諾塔問題 java實現)

2021-09-16 23:12:28 字數 2596 閱讀 5595

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。

法國數學家愛德華·盧卡斯曾編寫過乙個印度的古老傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

不管這個傳說的可信度有多大,如果考慮一下把64片金片,由一根針上移到另一根針上,並且始終保持上小下大的順序。這需要多少次移動呢?這裡需要遞迴的方法。假設有n片,移動次數是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此後不難證明f(n)=2^n-1。n=64時,假如每秒鐘一次,共需多長時間呢?乙個平年365天有31536000 秒,閏年366天有31622400秒,平均每年31556952秒,計算一下:18446744073709551615秒。

這表明移完這些金片需要5845.54億年以上,而地球存在至今不過45億年,太陽系的預期壽命據說也就是數百億年。真的過了5845.54億年,不說太陽系和銀河系,至少地球上的一切生命,連同梵塔、廟宇等,都早已經灰飛煙滅。

要想將x柱的四個盤子移到z柱,而且每次只能移動乙個,最後移動的肯定是最底下的盤子,也就是第4個盤子,那麼必須將前3個從x柱借助z柱移動到y柱,再將第4個盤子從x柱直接移到z柱,然後將y柱上的前3個盤子借助x柱移到z柱,那麼移動前3個盤子時候就得先移動前2個盤子,以此類推。。

package p03.遞迴;

/* * 假設現在64個盤子

* * 前63個 從x->y 借助z

* 前62個 從x->z 借助y

* 前61個 從x->y 借助z

* .....

* 第62個 從x->z

* 前61個 從y->z 借助x

* ....

* 第63個 從x->y

* 前62個 從z->y 借助x

* ....

* 第64個 從x->z

* 前63個 從y->z 借助x

* 前62個 從y->x 借助z

* ...

* 第63個 從y->z

* 前62個 從x->z 借助y

package p03.遞迴;

import 棧.arraystack;

public

class

hano

arraystack

stacky =

newarraystack

(); arraystack

stackz =

newarraystack

();move

(stackx, stacky, stackz, n)

; system.out.

println

("x柱"

+ stackx)

; system.out.

println

("z柱"

+ stackz);}

// x 源盤 y 借助盤 z目的盤

C 用遞迴解決漢諾塔問題

遞迴確實是乙個不錯的演算法,可以將原來很複雜的問題簡化.這裡要注意的就是要確定乙個出口條件.不然會出現段錯誤,也就是棧溢位.漢諾塔問題這裡不再贅述,而它的出口條件也就是移動乙個盤子,從源位址移動到目的位置.而如果要用遞迴的方法來實現就要將移動的方法簡化,我們先考慮移動n 1個盤子,從源移動到臨時位置...

遞迴解決漢諾塔問題

何為漢諾塔問題 漢諾塔 hanoi tower 又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間...

遞迴解決漢諾塔問題

漢諾塔 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。c語言實...