python递归函数例子_Python递归函数经典案例-汉诺塔问题
漢諾塔
漢諾塔問題是遞歸算法學習的一個經(jīng)典案例,首先來看下漢諾塔問題的相關描述:
漢諾塔問題起源于一個古老的印度傳說,大梵天創(chuàng)世時制作了三根金剛石石柱,在第一根柱子上從上往下從小到大摞著64片金盤,婆羅門要把第一根柱子上的所有圓盤按照同樣的順序重新放到另一根柱子上,要求小圓盤上不能放大圓盤,一次只能移動一個圓盤。
問題描述
我們的問題就是通過遞歸算法,設計一個算法可以計算輸出操作過程,編寫move(n,x,y,z)函數(shù),n代表初始狀態(tài)ABC三個柱子中第一個柱子A上一共幾個圓盤,要求輸出從柱子A借助柱子B全部移動到柱子C全過程。
三階的情況演示
我們先來看下從一個圓盤到三個圓盤時,操作的過程:
n=1時,我們只需要把圓盤從A移動到C一步即可;
n=2時,先把A上第一個圓盤移動到B,再把A上第二個圓盤移動到C,再把B上小盤子移動到C,一共三步;
n=3時,參照2個圓盤時的情況,具體操作如下圖
遞歸算法
我們在游戲過程中就是不斷借助B柱,把A柱從上到下1~(n-1)個圓盤借助C移動到B,再把A柱最大的圓盤n移動到C;再把B柱上1~(n-2)個圓盤借助C柱移動到A柱,再把n-1移動到C柱。。。。
可以發(fā)現(xiàn),我們其實一直是在從起始柱借助一個緩沖柱往目標柱放起始柱上最大的那個圓盤,
有函數(shù)move(n,x,y,z),我們設圓盤個數(shù)n,初始狀態(tài)起始柱為x,緩沖柱y,目標柱z,下面開始遞歸分析:
有n個圓盤,我們第一層的目標是把起始柱x上n-1個移動到緩沖柱y上,這一階段完成后,x上就是1,直接從x移動到z;
>1>第一層目標是把x上n-1移動到緩沖柱y上,即x是初始柱,y是目標柱,z是緩沖柱,就需要完成第二層目標將x上n-2(即:(n-1)-1)通過y柱移動z,這時y是緩沖柱,z是目標柱,這一步完成之后,x上只有1,直接從x移動到z;
Python遞歸函數(shù)解決
直接上代碼和運行結果
>>>def move(n,x,y,z):if n==1:print(x,'==>',z)else:move(n-1,x,z,y)print(x,'==>',z)move(n-1,y,x,z)>>> move(1,'A','B','C')A ==> C>>> move(2,'A','B','C')A ==> BA ==> CB ==> C>>> move(3,'A','B','C')A ==> CA ==> BC ==> BA ==> CB ==> AB ==> CA ==> C
反推驗證
最后,我們再反推下函數(shù)運算過程,以move(3,’A’,’B’,’C)為例:
總結
以上是生活随笔為你收集整理的python递归函数例子_Python递归函数经典案例-汉诺塔问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Oracle] 一个通过添加本地分区索
- 下一篇: 认识System Center之一