1. 程式人生 > >關於python漢諾塔問題的程式碼消化理解

關於python漢諾塔問題的程式碼消化理解

漢諾塔問題來了:

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

我們對柱子編號為a, b, c,將所有圓盤從a移到c可以描述為:

如果a只有一個圓盤,可以直接移動到c;

如果a有N個圓盤,可以看成a有1個圓盤(底盤) + (N-1)個圓盤,首先需要把 (N-1) 個圓盤移動到 b,然後,將 a的最後一個圓盤移動到c,再將b的(N-1)個圓盤移動到c。

請編寫一個函式,給定輸入 n, a, b, c,打印出移動的步驟:

move(n, a, b, c)

例如,輸入 move(3, 'A', 'B', 'C'),打印出:

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

先貼一下程式碼。表忠心。哇哈哈哈~

def move(n, a, b, c):
    if n ==1:
        print a, '-->', c
        return
    else:
        move(n-1, a, c, b)
        print a, '-->', c
        move(n-1, b, a, c)


move(6, 'A', 'B', 'C')

我雖然之前學過c和演算法,好像也在大學的時候做過這樣的問題,但是。。。我記性不好,忘記了委屈其實我覺得是我當時沒認真學習的原因哇哈哈哈哈

最近由於實習嘛,上班沒有太多的工作,所以一直在抽空自學python,發現這門語言還挺容易上手的,所以越學越有興趣呢!

然而,,,,,,然後我就發現這個問題很眼熟,可是還是研究了半天,憂桑~

然後我就想會不會有其他的同學,和我一樣有困惑呢,我就實際用我的小手操作了一下,如圖:


不怎麼聰明的我帶入了一下資料 整體看了一下是怎麼個流程,然後我想大概我明白了 別人也就該明白了吧 嘻嘻。

程式碼的理解就是和上面的問題說明是一樣的。如果有n個圓盤,就先把n-1個放到b,然後把留下的那個最下面的一個放到c。即是找到了最大的。最大的放在c上面,相當於沒有這個最大的了,可不用考慮的(比如說原來是8個盤子,那麼現在就是7個盤子的遊戲了,因為第8個可以先不用考慮了),然後遊戲重新遞迴,原理是把當前考慮到的圓盤n-1帶入n,然後把n-1個放到b,最下面的放到c,直到剩下一個為止,遊戲結束!

再解釋一句:開始的if中的a-->c的意思是,如果只有一個就直接從a放到c了,下面的a-->c是過程中的變換過程 不是a-->c是換了引數的。嘻嘻嘻 ~不懂的話可以繼續問我哦