漢諾塔演算法解析

2021-07-27 21:35:44 字數 1514 閱讀 1390

first declare the time:2023年2月17日13:26:35

主要問題:開頭有 n 個盤子,要求從 a 移動到 c , 並且最後盤子的順序不變。

主要思路:要考慮 n 個盤子的移動,只需考慮 n-

1 個盤子是如何移動的,第 n個盤子直接移動即可;

要考慮 n-

1個盤子的移動,只需考慮 n-

2個盤子是如何移動的,第 n-

1個盤子直接移動即可;

要考慮 n-

2個盤子的移動,只需考慮 n-

3個盤子是如何移動的,第 n-

2個盤子直接移動即可;

如果盤子總數為 1個,直接移動即可;

主要步驟:把 a的 n-

1個盤子,先移動到 b,再把 a的 第n個盤子移動到 c ,最後把 b 的 n-

1個盤子 移動到 c

先把 a的n-

1個盤子 借助 c 移動到 b ( a -> b )

n-1個盤子移動方式:

先把 n-

2個盤子 從a 借助b 移動到c,再把 a的第 n-

1個直接 移動到 b,再把c的 n-

2個盤子借助a 移動到b

n-2個盤子移動方式:( a -> c )

先把 a的 n-

3個盤子借助 c移動到 b,再把 a的第 n-

2個直接 移動到c,再把b的 n-

3個盤子借助a 移動到c

n-2個盤子移動方式:( c -> b )

......

......

......

......

......

..之後再 n-

3 個盤子移動方式,以此類推...

......

......

......

......

......

而第 n 個盤子 直接從 a 移動到c 即可。

之後再把 b 上面的 n-

1 個盤子移動到 c

n-1個盤子移動方式:從 b 借助 a 移動到 c

其實程式中 起到實的,也就兩條語句:

1). 第 n個盤子直接移動即可 ;

2). 剩乙個盤子直接移動即可,並且遞迴結束;

ok,總結一句話:遞迴就是不要把問題想得太複雜,要簡單而優雅,要有不同呼叫,也要有結束出口。

**如下:

#include 

void hanoi(int n,char left,char mid,char right)

hanoi(n-1,left,right,mid);

printf("第%d個盤子,從%c柱子移動到%c柱子\n",n,left,right);

hanoi(n-1,mid,left,right);

return ;

} int main()

漢諾塔演算法

最簡步驟 2的n次冪 1 為了實現 n個盤從 借助c 從a 移動到 b 思路如下 首先考慮極限當只有乙個盤的時候 只要 盤直接從 a b即可 那麼當有2個盤的時候就只要先把1號盤從a c 然後 把2號盤 a b 再 把 2好盤從 c b 那麼當有n個盤的時候你只要先把 n 1個 盤 借助 b 移動到...

漢諾塔演算法

解法 如果柱子標為abc,要由a搬至c,在只有乙個盤子時,就將它直接搬至c,當有兩個盤子,就將b當作輔助柱。如果 盤數超過兩個,將第三個以下的盤子遮起來,就很簡單了,每次處理兩個盤子,也就是 a b,a c,b c這三個 步驟,而被遮住的部分,其實就是進入程式的遞迴處理。事實上,若有n個盤子,則先移...

漢諾塔演算法

乙個印度傳說 在乙個神廟裡有有乙個漢諾塔,就是乙個銅板上插著3個寶石針,其中一根針從上到下的穿著由小到大的銅片64片,僧人們一次只能移動乙個銅片,並且不論移到哪個針上,必須保持小片在大片上面。僧侶們預言,當所有的銅片都從穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消亡。當然,這只是個傳說,...