#一日一詞#
今天在學習python的時候,遇到了遞迴問題,案例呢就是經典的漢諾塔遊戲,表示雖然以前就接觸過這遊戲,解起來也很容易,不過放在程式設計裡,幾行的**可夠我手推了乙個多小時。╭∩╮(︶︿︶)╭∩╮
當然也是感受到了搞清楚乙個(我認為的)難題的樂趣,心情大好,買條褲子。
首先說下漢諾塔遊戲,如下圖,需要利用中間的柱子將左邊的所有圓盤移動到最右邊的柱子上,且和原來的大小上下順序一致,移動過程中保證**永遠在小盤下面。
c,先考慮只有兩個圓盤的情況(自行yy),接下來的思路就是把a上的所有圓盤分為兩部分,看做只有兩個圓盤,乙個為最底層大圓盤,另乙個為剩餘部分,就好解決了;在最大圓盤移到c柱後,就不用考慮這個最**,剩餘的利用同樣的思路進行。
好,說完遊戲,接著說下遞迴。
遞迴函式的定義,簡單說就是函式在函式內部呼叫自身作為函式的一部分。
定義乙個計算階乘的函式,n!=n*(n-1)!,然後(n-1)!=(n-1)*(n-2)!,以此類推,編寫函式(python語言,def是定義函式的開頭):
def fact(n):
if n==1:
return 1
return n * fact(n - 1)
這裡就是計算:
n*fact(n-1)=n*(n-1)*fact(n-2)=…
這就是遞迴,自己呼叫自己,類似迴圈的東西。這裡就不多敘述,重點是下面的東西。
用遞迴函式解漢諾塔:**很少,利用幾行遞迴和簡單思路,卻能把任繞進去。不廢話,上**。
先提前提醒,接下來的過程中一定要分清形參和實參。
def move(n, a, b, c):
if n ==1:
print a,'-->', c
return
move(n-1, a, c,b)
print a,'-->', c
這裡定義了乙個move函式,用以返回漢諾塔遊戲的步驟,引數(n,a,b,c)分別指最左邊的柱子上有n個圓盤(一次放好的)、左邊的柱子a、中間的柱子b,右邊的柱子c。表示a柱上有n個圓盤,通過b柱,移動到c柱。
先分析一下,第一部分的判斷,即:假如n=1,表示只有乙個圓盤,則輸出「a-->c」,即一步到位。
第二部分:遞迴部分。如果n>1,則呼叫move函式,將n-1個圓盤從a柱先移到b柱上去,呼叫乙個遞迴,在這個n-1的遞迴完成後(這句話很重要),再將a柱上剩下的最**移動到c柱,即輸出「a-->c」,剩餘的進行遞迴,這時n-1個盤全部在b柱上,因此需要將n-1個盤移動c柱上,即move(n-1,b,a,c)。剩下的步驟就回到最初的起點,呆呆的站在柱子前。。。。
這裡的分析基本上只有兩步,多了怕把你繞進去。同時在分析過程中始終理清形參與實參。
接下來咱們實際操作,先簡單的:move(3,d,e,f)
這描述夠詳細了
接下來咱們就一步一步來推算。
第一步:
以上是第一步,注意,這時不應該輸出任何東西,雖然有「print d,」-->」,f」,但這不是我們的第一步,第一步是「move(2,d,f,e)」,所以應繼續計算「move(2,d,f,e)」,這裡做個標記x1,表明還有兩行**未執行,接下來計算「move(2,d,f,e)」:
這裡是針對x1步驟裡的遞迴,但是還沒結束,因為還有個遞迴「move (1,d,e,f)」,這裡我們標記x2,表明這裡還有兩行**未執行,而且有乙個遞迴。
接下來是執行x2裡的遞迴,「move (1,d,e,f)」:
到這裡,我們第一步裡的最裡層的遞迴就結束了,我們標記為x3,所以這x3所輸出的結果才是整個過程的第一步。
到這裡,我們完成了x2裡的第一行遞迴**(就是x3),可以回到x2繼續執行,及x2剩餘的兩行**,
到這裡,x3和x2就完成了,這時我們已經得到三步,回到x1,接著完成x1,剩下兩行**:
到這裡就只剩下move(2,e,d,f)這個遞迴了。
到此,整個遞迴就結束了,整合步驟:
d-->f
d-->e
f-->e
d-->f
e-->d
e-->f
d-->f
以及**驗證結果(這裡是在pycharm環境下編寫):
最後附我的手推過程:(能看懂的話)
漢諾塔 遞迴
個人理解遞迴函式的基本要求就是,函式中呼叫函式本身,滿足特定的條件後返回。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...