漢諾(Hanoi)塔問題總結
阿新 • • 發佈:2018-12-12
今天學廖雪峰的python教程看到漢諾塔問題,就重新複習一下
漢諾塔問題
演算法思路
分三步走(假設三個座A、B、C,共n個盤子)
- 將n-1個盤子藉助C座,將A移到B
- 將最後一個盤子從A移到C
- 將n-1個盤子藉助A座,從B移到C
程式碼實現
# -*- coding: utf-8 -*-
def move(n, a, b, c)
if n==1:
print(a, '-->', c)
else:
move(n-1, a, c, b)
move(1, a, b, c)
move(n-1,b, a , c)
程式碼解釋:else:
後面的三個move()
對應三步思路,注意在n==1時,移動最後一個盤子,並打印出步驟
總結演算法
漢諾塔問題是一個典型的遞迴演算法,關鍵是化繁為簡的思想——整理出演算法的一般規則,然後根據函式自身的呼叫來實現演算法。
補充:遞迴的定義
維基上遞迴的定義:
- 遞迴(英語:Recursion),又譯為遞迴,在數學與電腦科學中,是指在函式的定義中使用函式自身的方法。
遞迴的定義主要用於定義無限集合,因為定義無限集合不可能列舉出所有元素,對於一些大的集合也是如此。
所謂遞迴的定義由兩部分組成:第一部分稱為錨(anchor)或者基例(ground case),列出了產生集合中其他元素的基本元素;第二部分給出由基本元素或已有物件產生新物件的構造規則。這些規則被反覆使用,從而產生新的物件。舉個例子,要構造自然數集合,取0為基本元素,並給出累加1的構造規則;漢諾塔中取列印移動盤子步驟為基本元素,並整理出移動盤子的規則。