漢諾塔問題
漢諾塔的移動可以用遞歸函數非常簡單地實現。請編寫move(n, a, b, c)
函數,它接收參數n
,表示3個柱子A、B、C中第1個柱子A的盤子數量,然后打印出把所有盤子從A借助B移動到C的方法。
漢諾塔問題的實現關鍵是理解遞歸的本質。遞歸問題的關鍵個人認為是,重目的而略過程。利用遞歸,我們不需要了解搬移盤子的過程。只需要知道,我們的目的是按照順序和規則把盤子從A柱放到C柱。於是編寫一個函數,move(n, a, b, c)。可以這樣理解:move(盤子數量, 起點, 緩沖區, 終點)。
分析函數要執行的步驟:
1、A上只有一個盤子的情況,直接搬到C,代碼如下:
if n == 1: print(a, '-->', c)
2、A上不止有一個盤子的情況
2.1 首先,需要把n-1個盤子搬到緩沖區B柱子。打印出的效果是:a --> b。
move(n - 1, a, c, b)
2.1 再把最大的盤子搬到C柱子,也是最大尺寸的一個。打印出:a-->c。
move(1, a, b, c)
2.2 最后,把剩下B柱的n-1個盤子搬到C上,此時緩沖區變成了起點,起點變成了緩沖區。
move(n - 1, b, a, c)
3、完整的代碼十分簡潔,如下所示:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-05-22 16:22:13 # @Author : Chen Jing (cjvaely@foxmail.com) # @Link : https://github.com/Cjvaely # @Version : $Id$ # 漢諾塔的移動可以用遞歸函數非常簡單地實現 # 需求:打印出把所有盤子從A借助B移動到C的方法 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) # 期待輸出: # A --> C # A --> B # C --> B # A --> C # B --> A # B --> C # A --> C move(3, 'A', 'B', 'C')