學習 遞迴中的漢諾塔問題

2021-09-25 20:00:14 字數 985 閱讀 9869

遞迴,簡單來說,是一種函式呼叫自身的演算法

遞迴可以用在乙個很古老的問題——漢諾塔問題上。

漢諾塔問題:

大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片**圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤

三根柱子 a ,b ,c ,假設有n=3個盤子,需要將所有的盤子從a移到c

第乙個盤子:a–>c

第二個盤子:a–>b

第乙個盤子:c–>b

第三個盤子:a–>c

第乙個盤子:b–>a

第二個盤子: b–>c

第乙個盤子:a–>c

經過類似的討論,我們發現,盤子的移動方式為:

1.n-1個盤子的途徑為a–>c–>b

2.第n個盤子的路徑為a–>c

3.n-1個盤子的路徑為b–>a–>c

利用遞迴,呼叫自身函式,實現此方式

定義乙個函式hannuota,在此函式中呼叫自身

遞迴函式

else

這裡進入遞迴函式之後不斷呼叫自身,例如,n=2,呼叫後進入else,實行n-1,a–>c–>b(移動但是不顯示),然後進入if,進入move函式

a、b、c的位置是不變的,可以看成三根柱子。這裡的變換可以看成a、b、c字母位置的變換

完整程式為

package my;

public

class

hannuota

else

}public

static

void

move

(int n,

char x,

char y)

public

static

void

main

(string[

] args)

}

漢諾塔問題(遞迴)

題目描述 對於傳統的漢諾塔遊戲我們做乙個拓展,我們有從大到小放置的n個圓盤,開始時所有圓盤都放在左邊的柱子上,按照漢諾塔遊戲的要求我們要把所有的圓盤都移到右邊的柱子上,請實現乙個函式列印最優移動軌跡。給定乙個int n,表示有n個圓盤。請返回乙個string陣列,其中的元素依次為每次移動的描述。描述...

漢諾塔問題(遞迴)

問題 漢諾塔問題 解法 遞迴求解 思路 先把n 1從a移動b 在把第n個從a移到c 使用遞迴使得 變得簡單 複雜度 2的n次方 1 includeint step 1 void hanoi int level,char a,char b,char c 1 當盤子數大於1時,先把n 1個從a借助c移動...

漢諾塔問題(遞迴)

漢諾塔 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,有三根柱子。印度教的主神梵天在創造世界的時候,在其中一根柱子上從下到上地穿好了由大到小的64片金盤,這就是所謂的漢諾塔。不論白天黑夜,總有乙個僧侶在按照下面的法則移動這些金盤 一次只移動一片,不管在哪根柱子上,小片必須在...