1. 程式人生 > 其它 >漢諾塔的遞迴圖解

漢諾塔的遞迴圖解

漢諾塔的圖解遞迴演算法

原文連結:(轉載請註明出處)https://dmego.cn/2016/10/16/hanoi

一.起源:

  漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。

二.抽象為數學問題:

  如下圖所示,從左到右有A、B、C三根柱子,其中A柱子上面有從小疊到大的n個圓盤,現要求將A柱子上的圓盤移到C柱子上去,期間只有一個原則:一次只能移到一個盤子且大盤子不能在小盤子上面,求移動的步驟和移動的次數

解:(1)n == 1

      第1次 1號盤 A---->C sum = 1 次

(2) n == 2

      第1次 1號盤 A---->B

       第2次 2號盤 A---->C

      第3次 1號盤 B---->C sum = 3 次

  (3)n == 3

        第1次 1號盤 A---->C

        第2次 2號盤 A---->B

        第3次 1號盤 C---->B

        第4次 3號盤 A---->C

        第5次 1號盤 B---->A

        第6次 2號盤 B---->C

        第7次 1號盤 A---->C sum = 7 次

不難發現規律:1個圓盤的次數 2的1次方減1

       2個圓盤的次數 2的2次方減1

關於漢諾塔的公式:

可以這樣理解:

其中

代表把冰箱門開啟又合上,即完成兩次n-1層漢諾塔的過程,
+1 代表移動漢諾塔最下面一層,即把大象裝冰箱的過程。

冰箱門開啟或者合上需要的步數都是一樣的,
都是完成一個m=n-1層漢諾塔的過程。

3個圓盤的次數 2的3次方減1

。 。 。 。 。

n個圓盤的次數 2的n次方減1

故:移動次數為:2^n - 1

遞迴的思路:把n-1個盤子移動到輔助塔,再將第n個盤子移動到目的塔,再將n-1個盤子從輔助塔移動到目地塔.

三.呼叫方法的棧機制:(特點:先進後出)

從主執行緒開始呼叫方法(函式)進行不停的壓棧和出棧操作,函式的呼叫就是將函式壓如棧中,函式的結束就是函數出棧的過程,這樣就保證了方法呼叫的順序流,即當函數出現多層巢狀時,需要從外到內一層層把函式壓入棧中,最後棧頂的函式先執行結束(最內層的函式先執行結束)後出棧,再倒數第二層的函式執行結束出棧,到最後,第一個進棧的函式呼叫結束後從棧中彈出回到主執行緒,並且結束。

四.演算法分析(遞迴演算法):

我們在利用計算機求漢諾塔問題時,必不可少的一步是對整個實現求解進行演算法分析。到目前為止,求解漢諾塔問題最簡單的演算法還是同過遞迴來求,至於是什麼是遞迴,遞迴實現的機制是什麼,我們說的簡單點就是自己是一個方法或者說是函式,但是在自己這個函式裡有呼叫自己這個函式的語句,而這個呼叫怎麼才能呼叫結束呢?,這裡還必須有一個結束點,或者具體的說是在呼叫到某一次後函式能返回一個確定的值,接著倒數第二個就能返回一個確定的值,一直到第一次呼叫的這個函式能返回一個確定的值。

實現這個演算法可以簡單分為三個步驟:

    (1) 把n-1個盤子由A 移到 B;

    (2) 把第n個盤子由 A移到 C;

    (3) 把n-1個盤子由B 移到 C;

從這裡入手,在加上上面數學問題解法的分析,我們不難發現,移到的步數必定為奇數步:

    (1)中間的一步是把最大的一個盤子由A移到C上去;

    (2)中間一步之上可以看成把A上n-1個盤子通過藉助輔助塔(C塔)移到了B上,

    (3)中間一步之下可以看成把B上n-1個盤子通過藉助輔助塔(A塔)移到了C上;

五,java原始碼:

這裡的a把他理解為盤子的起始位置,b理解為輔助位置,c理解為目標位置,而不應該是字元"A","B","C"

七.程式執行截圖: