1. 程式人生 > >漢諾(Hanoi)塔問題總結

漢諾(Hanoi)塔問題總結

今天學廖雪峰的python教程看到漢諾塔問題,就重新複習一下

漢諾塔問題

演算法思路

三步走(假設三個座A、B、C,共n個盤子)

  1. 將n-1個盤子藉助C座,將A移到B
  2. 將最後一個盤子從A移到C
  3. 將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的構造規則;漢諾塔中取列印移動盤子步驟為基本元素,並整理出移動盤子的規則。