1. 程式人生 > >Python遞迴呼叫_漢諾塔問題

Python遞迴呼叫_漢諾塔問題

遞迴函式的優點是定義簡單,邏輯清晰。理論上,所有的遞迴函式都可以寫成迴圈的方式,但迴圈的邏輯不如遞迴清晰。

使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的,每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞迴呼叫的次數過多,會導致棧溢位。

任務
漢諾塔 (http://baike.baidu.com/view/191666.htm) 的移動也可以看做是遞迴函式。
我們對柱子編號為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(2, ‘A’, ‘B’, ‘C’),打印出:
A –> B
A –> C
B –> C

#-*- coding:utf-8 -*-
# move(n, a, b, c)表示的是有n個盤子在a柱子上,將要移到c柱子上面去

def move(n, a, b, c):
    #如果a柱子上面只有一個盤子,則直接移到c柱子上面去並輸出路徑,結束遞迴
    if n == 1:  
        print a, '-->', c
        return
    #表示的是將n-1的盤子從a柱子上面移到b柱子上面去
    move(n-1, a, c, b)
    #輸出最下面個盤子移從a移到c的路徑
    print a, '-->', c
    #將b柱子上面的n-1個盤子移動到c柱子上面
move(n-1, b, a, c) move(4, 'A', 'B', 'C')