資料結構(十二)遞迴的應用 漢諾塔問題

2022-09-07 02:57:14 字數 1462 閱讀 8678

一、漢諾塔問題描述

設有三根標號為a,b,c的柱子,在a柱子上放著n個盤子,每個逗比下面的略小一點,要求把a上的盤子全部轉移到c上,移動的規則是:①一次只能移動乙個盤子;②移動過程中**子不能放在小盤子上面;③在移動過程中盤子可以放在a,b,c的任意乙個柱子上。

二、用遞迴方法求解n個盤子的漢諾塔問題的基本思想

乙個盤子的漢諾塔問題可以直接移動(遞迴出口)。

n個盤子的漢諾塔問題可遞迴表示為:首先把上邊的n-1個盤子從a移動b,然後把最下邊的乙個盤子從a移到c(直接求解),最後把移到b的n-1個盤子移到c。

三、用遞迴求解漢諾塔問題的實現

1.演算法實現

package

bigjun.iplab.hanoitowers;

public

class

hanoitowers

//將n-1個盤子從a借助c移到b

htowers(n - 1, form, via, to);

system.out.println("移動盤子" + n + "從" + form + "到" +to);

//將n-1個盤子從b借助a移到c

htowers(n - 1, via, to, form);

}public

static

void

main(string args)

}

2.輸出

移動盤子1從a到b

移動盤子2從a到c

移動盤子1從b到c

移動盤子3從a到b

移動盤子1從c到a

移動盤子2從c到b

移動盤子1從a到b

移動盤子4從a到c

移動盤子1從b到c

移動盤子2從b到a

移動盤子1從c到a

移動盤子3從b到c

移動盤子1從a到b

移動盤子2從a到c

移動盤子1從b到c

3.結合輸出分析**執行過程

將4個盤子從a借助b移到c可分為如下過程:

將3個盤子從a借助c移到b,然後再將1個盤子從a移到c,最後把3個盤子從b移到c

將3個盤子從a借助c移到b可分為如下過程:

將2個盤子從a借助b移到c,然後再將1個盤子從a移到b,最後把2個盤子從c移到b

將2個盤子從a借助b移到c可分為如下過程:

將1個盤子從a移到b,然後將1個盤子從a移到c,最後將1個盤子從b移到c

四、演算法分析

遞迴演算法把移動n個盤子的漢諾塔問題分解為移動n-1個盤子的漢諾塔問題,把移動n-1個盤子的問題分解成n-2個盤子的問題,...,把移動兩個盤子的漢諾塔問題分解成移動乙個盤子的漢諾塔問題。對於乙個盤子的漢諾塔問題則直接求解(即直接移動)。在乙個盤子的漢諾塔問題解決後,可以解決兩個盤子的漢諾塔問題,...,在n-1個盤子的漢諾塔問題解決後,可以解決n個盤子的漢諾塔問題。這樣n個盤子的漢諾塔問題最終就得以解決。

資料結構(c語言)漢諾塔(Hanno)遞迴實現

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

經典問題 C語言資料結構 漢諾塔 遞迴

漢諾塔可以說是非常經典的遞迴呼叫的例子,關於它的 有興趣可以自己查一下。它的操作形象點講就是 在a b c三根柱子中,將a柱子上的n個圓盤 從上到下圓盤直徑依次增大的堆疊方式 利用b和c移動到c柱子上,並且每次只能移動乙個圓盤,小圓盤必須在大圓盤上面。實現步驟 1 假設a中共有n個圓盤,先將其中的n...

資料結構11 漢諾塔問題

漢諾塔是乙個經典遞迴問題,但是我覺得確實有點繞,看了一會兒,總算有點眉目吧 假設有n層圓盤需要挪動,需要從x,y,z之間移動,那麼目的就是將最後一層的圓盤挪動到z軸上,但是要完成這一步,就需要將前n 1層所有的圓盤,按照從小到大的順序暫時放置在y軸上。將最後乙個圓盤放置到z上的時候,需要將y上的n ...