漢諾塔遞迴實現 C 版本

2021-09-21 22:14:34 字數 3102 閱讀 3666

漢諾塔的計算實現是演算法課程中遞迴部分的經典案例。演算法不難,但是要實現,還是要動點腦筋的。大致描述如下:

就是要把n個盤移動到目標柱,首先得把n-1個盤移動到臨時柱。

然後把把剩下的最大的盤移動到目標柱。

然後把臨時柱作為起始柱,原先的起始柱作為臨時柱,重複上述步驟。

如果只移動起始柱的乙個盤,就直接放到目標柱即可。

————————————————————————————

大致描述就是如此,大多演算法書的輸出無非是幾個箭頭移來移去,不直觀。因此此處採用c#重新寫了一遍,看注釋即可明白。

其中move_1和move是一樣的,僅僅是採用last()方法還是用臨時tmp的區別,個人認為用last更好理解點。本質都一樣。

tolist.add(fromlist.last()); fromlist.remove(fromlist.last()); printstatus();

tolist.add(tmp); fromlist.remove(tmp); printstatus();

附**:

using system;

using system.collections.generic;

using system.linq;

using system.text;

using system.dynamic;

;static list a = new list() ;

static list b = new list() ;

static list c = new list() ;

static

int count = 0;

static

void main(string args)

//move,表示把n個盤子從fromlist,經過tmplist作為臨時柱,移動到目標柱tolist

static

public

void move_1(int n, ref list fromlist, ref list tmplist, ref list tolist)

else

}//move,表示把n個盤子從fromlist,經過tmplist作為臨時柱,移動到目標柱tolist

static

public

void move(int n, ref list fromlist, ref list tmplist, ref list tolist)

else

}static

public

void printstatus()

}}

-----------------5個盤的實現過程-----------

a:54321

b:c:

-------------------

a:5432

b:c:1

-------------------

a:543

b:2c:1

-------------------

a:543

b:21

c:-------------------

a:54

b:21

c:3-------------------

a:541

b:2c:3

-------------------

a:541

b:c:32

-------------------

a:54

b:c:321

-------------------

a:5b:4

c:321

-------------------

a:5b:41

c:32

-------------------

a:52

b:41

c:3-------------------

a:521

b:4c:3

-------------------

a:521

b:43

c:-------------------

a:52

b:43

c:1-------------------

a:5b:432

c:1-------------------

a:5b:4321

c:-------------------

a:b:4321

c:5-------------------

a:1b:432

c:5-------------------

a:1b:43

c:52

-------------------

a:b:43

c:521

-------------------

a:3b:4

c:521

-------------------

a:3b:41

c:52

-------------------

a:32

b:41

c:5-------------------

a:321

b:4c:5

-------------------

a:321

b:c:54

-------------------

a:32

b:c:541

-------------------

a:3b:2

c:541

-------------------

a:3b:21

c:54

-------------------

a:b:21

c:543

-------------------

a:1b:2

c:543

-------------------

a:1b:

c:5432

-------------------

a:b:

c:54321

-------------------

移動次數:31

C 遞迴實現漢諾塔

a為存放盤子的塔,b為目標塔,c為輔助塔 演算法分為三步 一 將a上n 1個盤子全部放到c塔上 二 將a上剩下的乙個盤子放到b塔上 三 將c塔上的盤子全部放到b塔上 注 不需要考慮如何移動n 1個盤子 遞迴過程 首先,將a上n 1個盤子放到c上,然後將a上剩下的乙個盤子放到b上,然後可以看成a為輔助...

C 漢諾塔遞迴實現

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

C 遞迴,漢諾塔

a為存放盤子的塔,b為目標塔,c為輔助塔 演算法分為三步 一 將a上n 1個盤子全部放到c塔上 二 將a上剩下的乙個盤子放到b塔上 三 將c塔上的盤子全部放到b塔上 注 不需要考慮如何移動n 1個盤子 遞迴過程 首先,將a上n 1個盤子放到c上,然後將a上剩下的乙個盤子放到b上,然後可以看成a為輔助...