漢諾塔遞迴

2022-08-24 20:33:07 字數 3190 閱讀 9389

#一日一詞#

今天在學習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剩餘的兩行**,

到這裡,x3x2就完成了,這時我們已經得到三步,回到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...