日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python递归函数例子_Python递归函数经典案例-汉诺塔问题

發(fā)布時間:2024/1/8 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python递归函数例子_Python递归函数经典案例-汉诺塔问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

漢諾塔

漢諾塔問題是遞歸算法學(xué)習(xí)的一個經(jīng)典案例,首先來看下漢諾塔問題的相關(guān)描述:

漢諾塔問題起源于一個古老的印度傳說,大梵天創(chuàng)世時制作了三根金剛石石柱,在第一根柱子上從上往下從小到大摞著64片金盤,婆羅門要把第一根柱子上的所有圓盤按照同樣的順序重新放到另一根柱子上,要求小圓盤上不能放大圓盤,一次只能移動一個圓盤。

問題描述

我們的問題就是通過遞歸算法,設(shè)計(jì)一個算法可以計(jì)算輸出操作過程,編寫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í)一直是在從起始柱借助一個緩沖柱往目標(biāo)柱放起始柱上最大的那個圓盤,

有函數(shù)move(n,x,y,z),我們設(shè)圓盤個數(shù)n,初始狀態(tài)起始柱為x,緩沖柱y,目標(biāo)柱z,下面開始遞歸分析:

有n個圓盤,我們第一層的目標(biāo)是把起始柱x上n-1個移動到緩沖柱y上,這一階段完成后,x上就是1,直接從x移動到z;

>1>第一層目標(biāo)是把x上n-1移動到緩沖柱y上,即x是初始柱,y是目標(biāo)柱,z是緩沖柱,就需要完成第二層目標(biāo)將x上n-2(即:(n-1)-1)通過y柱移動z,這時y是緩沖柱,z是目標(biāo)柱,這一步完成之后,x上只有1,直接從x移動到z;

Python遞歸函數(shù)解決

直接上代碼和運(yùn)行結(jié)果

>>>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

反推驗(yàn)證

最后,我們再反推下函數(shù)運(yùn)算過程,以move(3,’A’,’B’,’C)為例:

總結(jié)

以上是生活随笔為你收集整理的python递归函数例子_Python递归函数经典案例-汉诺塔问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。