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
其實程式中 起到實的,也就兩條語句:ok,總結一句話:遞迴就是不要把問題想得太複雜,要簡單而優雅,要有不同呼叫,也要有結束出口。1). 第 n個盤子直接移動即可 ;
2). 剩乙個盤子直接移動即可,並且遞迴結束;
**如下:
#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片,僧人們一次只能移動乙個銅片,並且不論移到哪個針上,必須保持小片在大片上面。僧侶們預言,當所有的銅片都從穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消亡。當然,這只是個傳說,...