【Python學習之七】遞歸——漢諾塔問題的算法理解


漢諾塔問題

       漢諾塔的移動可以用遞歸函數非常簡單地實現。請編寫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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM