漢諾塔,遞歸與 python 實現(xiàn)

漢諾塔問題

在三個柱子 A,B,C 中的 A 柱子上放著若干圓盤,其中下面的圓盤總比上面的圓盤大,這個規(guī)則三個柱子都必須遵循,目的是:借助三個柱子把若干圓盤都從 A 柱子上移到 C 柱子上,求解其中的步驟。

漢諾塔與遞歸

漢諾塔問題是一個經(jīng)典的遞歸問題。
簡單的遞歸理解就是在一個方法中調(diào)用它本身。
更進一步的理解,就是把一個問題持續(xù)分解為更簡單的問題,直至問題小到可以解決,當然核心還是調(diào)用了它本身來解決。

漢諾塔思想

把 A 柱子上的圓盤移到 C 柱子上的步驟最終只有三個而已

  1. 把 A 柱子上的除最后一個外的所有園盤都移到 B 柱子上。
  2. 把 A 柱子上剩下的那個圓盤移到 C 柱子上。
  3. 把剩下的 B 柱子上的所有圓盤豆移到 C 柱子上。

python 實現(xiàn)

count = 0  # 計算總共有多少步
def hanoi(a, b, c, num):
    """
    漢諾塔
    :param a: A 柱子
    :param b: B 柱子
    :param c: C 柱子
    :param num:  圓盤個數(shù)
    :return: 
    """
    global count 
    if num == 1:  # 當剩下一個盤時,從 "A" 柱子上移到 "C" 柱子上(注意引號)
        count += 1
        print a + "->" + c
        return
    num -= 1
    hanoi(a, c, b, num)  # 第一步: 把 A 柱子上的除最后一個外的所有原盤都移到 B 柱子上。
    count += 1
    print a + "->" + c  # 第二步: 把 A 柱子上剩下的那個圓盤移到 C 柱子上。
    hanoi(b, a, c, num)  # 第三步:把剩下的 B 柱子上的所有圓盤豆移到 C 柱子上。


if __name__ == '__main__':
    hanoi("A", "B", "C", 3)
    print count

返回結(jié)果:

A->C
A->B
C->B
A->C
B->A
B->C
A->C
7

感謝閱讀!
如果文章中有錯誤或存在誤解的地方,麻煩多加指教,無比感謝!
The End.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 前置文章:遞歸算法:m.itdecent.cn/p/703069f3ba3f . 漢諾塔問題是來源于印度傳...
    郎小凱閱讀 868評論 0 1
  • 文章也同時在個人博客 http://kimihe.com/[http://kimihe.com/2016/12/2...
    QihuaZhou閱讀 2,534評論 0 2
  • 原文鏈接(轉(zhuǎn)載請注明出處)漢諾塔的圖解遞歸算法 起源 漢諾塔(又稱河內(nèi)塔)問題是源于印度一個古老傳說的益智玩具。大...
    Dmego閱讀 1,672評論 0 0
  • 漢諾塔算法 要想利用遞歸函數(shù)解決問題,一定要完成兩個基本的要素:遞歸的終止條件,遞推公式。為了分析得到遞歸函數(shù),下...
    LeeLom閱讀 5,721評論 7 7
  • 題目: 漢諾塔的移動可以用遞歸函數(shù)非常簡單地實現(xiàn)。 請編寫move(n, a, b, c)函數(shù),它接收參數(shù)n,表示...
    快樂的殺馬特閱讀 496評論 0 0

友情鏈接更多精彩內(nèi)容