正經(jīng)標(biāo)題:漢諾塔問(wèn)題解析與遞歸函數(shù)
在函數(shù)內(nèi)部,可以調(diào)用其他函數(shù)理疙。如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身晕城,這個(gè)函數(shù)就是遞歸函數(shù)。
在python里可以用遞歸函數(shù)優(yōu)雅的解決漢若塔問(wèn)題
漢諾塔:漢諾塔(又稱(chēng)河內(nèi)塔)問(wèn)題是源于印度一個(gè)古老傳說(shuō)的益智玩具窖贤。大梵天創(chuàng)造世界的時(shí)候做了三根金剛石柱子砖顷,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤(pán)。大梵天命令婆羅門(mén)把圓盤(pán)從下面開(kāi)始按大小順序重新擺放在另一根柱子上赃梧。并且規(guī)定滤蝠,在小圓盤(pán)上不能放大圓盤(pán),在三根柱子之間一次只能移動(dòng)一個(gè)圓盤(pán)授嘀。
代碼:
>>>def move(n,a,b,c):
... if n==1:
... print(a,'-->',c)
... else:
... move(n-1,a,c,b) #將前n-1個(gè)盤(pán)子從a移動(dòng)到b上
... move(1,a,b,c) #將最底下的最后一個(gè)盤(pán)子從a移動(dòng)到c上
... move(n-1,b,a,c) #將b上的n-1個(gè)盤(pán)子移動(dòng)到c上
>>> move(3,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
分析一下應(yīng)該是這樣:
懂的玩這個(gè)的人知道規(guī)律是物咳,柱子分為起始柱子,跳板柱子粤攒,目標(biāo)柱子
“宏觀”看所森,目標(biāo)是借助跳板柱子,把起始柱子n個(gè)圈弄到目標(biāo)柱子:用move(n,a,b,c) 代表這個(gè)大步驟夯接,a是起始焕济,中間參數(shù)b是跳板,c是目標(biāo)盔几∏缙總之假設(shè)move(n,a,b,c) 就是代表能辦成這事的標(biāo)準(zhǔn)。
具體如何辦到逊拍?
- 大了看分三步:
第一步是把n-1個(gè)a借助c弄到b上鞠,所以遞歸同理第一步就是 move(n-1,a,c,b)
第二步是把最底下這個(gè)a弄到c,move(1,a,b,c)
第三步將b上的n-1個(gè)盤(pán)子移動(dòng)到c上芯丧,move(n-1,b,a,c)
打開(kāi)冰箱芍阎,放進(jìn)大象,關(guān)掉冰箱缨恒,搞定谴咸!
這里的abc應(yīng)解讀為起始柱子轮听,跳板柱子,目標(biāo)柱子岭佳。 - 小了看都是這三步:
比如第一步怎么能把n-1個(gè)a弄到b血巍,第一(1)步就是,把n-2個(gè)a弄到c:move(n-2,a,b,c)珊随;第一(2)步是把最后一個(gè)a弄到b:....底下就知道怎么回事了述寡。 - 關(guān)鍵輸出步驟是n=1的時(shí)候,也就是 起始柱子-->目標(biāo)柱子 在標(biāo)準(zhǔn)move(n,a,b,c) 里叶洞,就是print(a,'-->',c) 鲫凶,注意不是('A''-->''C')。
拆分過(guò)程看看:
感覺(jué)遞歸函數(shù)很好用京办,像是把一頭大象在宏觀上分解成合乎共同邏輯的關(guān)鍵幾大塊掀序。先切出大塊,再遞歸循環(huán)下去惭婿,按照切大塊的方法把每一個(gè)大塊切成小塊不恭,都切到n=1的時(shí)候,就能把大象吃了财饥。