漢諾塔(hanoi tower),又稱河內塔,源於印度乙個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動乙個圓盤。問應該如何操作?
假如有三根柱子:
1、過程分析:
(1)當只有兩個盤子的時候(移動兩次):
a--b
a--c
b--c
(2)當有三個盤子的時候:
應該考慮將最上層的兩個較小的盤子先從a移動到b,然後將a上的最大的盤子(最底層)移動到c。
將最上層的盤子移到c;
中間的盤子移到b;
再將第一步的c上的盤子移動到b;
至此,最上層的兩個盤子已經成功的移動到了b。
現在,需要將a柱子上的最下層的盤子移動到c柱子上。
然後再將a柱子作為輔助位,b柱子作為起點,c柱子作為終點,將b上的兩個盤子移動到c即可。
(3)當有n個盤子的時候,需要先將c柱子作為輔助位,a為起始位,b為終點。將上面的n-1個盤子從a移動到b。
然後將最下層的盤子從a移動到c。
最後將b上面的n-1個盤子從b移動到c。
2、**實現:
#includevoid hanoi(int n,char a,char b,char c)else }執行結果:main()
以a上面初始為3個盤子:
3、遞迴演算法過程分析:
分解過程:在有三個盤子的情況下,先對函式執行分解過程,直到分解到引數為1的時候達到遞迴出口。
回溯過程:從引數為1開始向上回溯,引數為2的時候先執行輸出語句,然後執行輸出語句下面的一句,執行後又遇到遞迴出口(即引數為1)。
當回溯到引數為3的時候,先執行輸出語句,再執行輸出語句後引數為2的情況,需要再次進行分解操作,然後引數為1,到遞迴出口。然後對引數為2進行回溯,先執行輸出語句,再執行輸出語句後的函式,2減1遇到遞迴出口,至此,遞迴過程結束。
漢諾塔 遞迴
個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。include include include include include include include include include include include include include 標頭檔案引用的較多...
遞迴漢諾塔
遞迴問題 遞迴要有三個要素 1.遞迴結束條件 2.遞迴結束時的處理 3.抽取重複的邏輯,剝離外殼 重點都在這一步 漢諾塔問題 把圓盤從下面開始按大小順序重新擺放在另一根柱子上。且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。首先,要搞這個編碼得要知道漢諾塔的解題思路 1.把a塔上...
遞迴 漢諾塔
漢諾塔問題。這裡順便可以求出一共需要搬運的次數。以下是漢諾塔問題的解法 class hanoi from 搬運的起點,to 搬運的目標地,middle 臨時中轉地 private static int hanoi int level,char from,char to,char middle int...