最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python實(shí)現(xiàn)漢諾塔遞歸算法經(jīng)典案例

 更新時(shí)間:2021年03月01日 14:33:33   作者:Batman211112  
這篇文章主要大家分享了python實(shí)現(xiàn)漢諾塔遞歸算法經(jīng)典案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

學(xué)到遞歸的時(shí)候有個(gè)漢諾塔的練習(xí),漢諾塔應(yīng)該是學(xué)習(xí)計(jì)算機(jī)遞歸算法的經(jīng)典入門案例了,所以本人覺得可以寫篇博客來(lái)表達(dá)一下自己的見解。這markdown編輯器還不怎么會(huì)用,可能寫的有點(diǎn)格式有點(diǎn)丑啦,各位看官多多見諒.

網(wǎng)上找了一張漢諾塔的圖片,漢諾塔就是利用用中間的柱子把最左邊的柱子上的圓盤依次從大到小疊上去,說(shuō)白了就是c要跟原來(lái)的a一樣

廢話少說(shuō),先亮代碼

def move(n, a, buffer, c):
 if(n == 1):
  print(a,"->",c)
  return
 move(n-1, a, c, buffer)
 move(1, a, buffer, c)
 move(n-1, buffer, a, c)
move(3, "a", "b", "c")

首先是定義了一個(gè)移動(dòng)的函數(shù),四個(gè)參數(shù)分別代表,a柱上的盤子個(gè)數(shù),buffer也就是b柱,命名為buffer便于理解,顧名思義就是一個(gè)a移動(dòng)到c的緩沖區(qū).然后c就是目標(biāo)柱子
下面我們來(lái)讀函數(shù)代碼
遞歸的一般寫法,肯定有個(gè)中止遞歸循環(huán)的條件,所以在判斷a柱上的盤子個(gè)數(shù)為1的時(shí)候既可以中止遞歸并返回,a柱上面只有一個(gè)的時(shí)候肯定就是把a(bǔ)移動(dòng)到c了,重點(diǎn)是下面的代碼,遞歸其實(shí)是一種很抽象的算法,我們要利用抽象思維去想漢諾塔這個(gè)問(wèn)題,把a(bǔ)柱上的盤子想成兩份,就是上面的盤子和最底下的盤子,如果所示

我們不關(guān)心上面的盤子到底有幾個(gè),我們每次的操作就是把最底下的盤子通過(guò)緩沖區(qū) b柱 buffer 移動(dòng)到c柱。
童鞋們肯定在想為啥要醬紫移動(dòng)呢,其實(shí)這是一種總結(jié)歸納吧,你自己玩一下漢諾塔游戲就會(huì)發(fā)現(xiàn)規(guī)律,其實(shí)這個(gè)游戲就是不停的把上面的所有的想方設(shè)法的移到b上,然后把a(bǔ)最后最大的那個(gè)弄到c,然后再絞盡腦汁的把b上的移動(dòng)到c,這時(shí)候你就發(fā)現(xiàn),原來(lái)b上的也要先通過(guò)空的也就是a來(lái)存放當(dāng)前b上面的n-1個(gè),然后把b的最大最后的移動(dòng)到c,這里規(guī)律就體現(xiàn)出來(lái)了,也可以抽象出移動(dòng)的方法,并可以以此設(shè)計(jì)出程序算法.

以下我們來(lái)利用剛才的抽象思維解讀剩余代碼

move(n-1, a, c, buffer)

這段代碼就是表示把剛才所說(shuō)的a柱的上面的n-1個(gè),通過(guò)c按照從小到大的規(guī)則先移動(dòng)到緩沖區(qū)buffer。此函數(shù)進(jìn)入遞歸。

move(1, a, buffer, c)

當(dāng)上面的語(yǔ)句執(zhí)行完成,也就是n-1個(gè)盤子的遞歸移動(dòng)完成之后,執(zhí)行此語(yǔ)句,就是把a(bǔ)柱上的一個(gè)盤子移動(dòng)到c,也就是所謂的最底下的盤子

move(n-1, buffer , a, c)

最后一步,就是剛才把a(bǔ)上面的n-1個(gè)都移動(dòng)到了buffer上面,肯定要通過(guò)a移動(dòng)到c才能完成整個(gè)漢諾塔的移動(dòng)啊,于是最后一步自然是把剛才的n-1個(gè)通過(guò)a當(dāng)緩沖區(qū)移動(dòng)到c柱上.
我來(lái)寫下整個(gè)移動(dòng)流程,以a柱上有3個(gè)為例子

/**
我把3個(gè)盤子的漢諾塔全部通過(guò)代碼演示,按縮進(jìn)原則,每一個(gè)縮進(jìn)即進(jìn)一個(gè)遞歸函數(shù),每打印一次即中止當(dāng)前遞歸,也就是每個(gè)print
說(shuō)明:
 1.n = 3, n = 2, n = 1是每次執(zhí)行if(n == 1)的結(jié)果,這里就不寫判斷了,相信童鞋們也能看懂,也就是n不等與1時(shí)就減1進(jìn)入遞歸
 2.請(qǐng)注意a,b,c柱每次進(jìn)入函數(shù)的順序,不要被形參帶錯(cuò)路了,看準(zhǔn)每次函數(shù)參數(shù)的實(shí)參 
**/
move(3, "a", "b", "c")
n=3:
 //開始從a上移動(dòng)n-1即2個(gè)盤子通過(guò)c移動(dòng)到b,以騰出c供a最后一個(gè)盤子移動(dòng)
 move(2, "a","c","b")
 n=2:
 //開始進(jìn)行n=2的一個(gè)遞歸,把當(dāng)前a('a')柱上的n-1個(gè)盤子通過(guò)c('b')移動(dòng)到b('c')
  move(1, "a", "b", "c")
  n=1:
  //n=2的第一個(gè)遞歸完成,打印結(jié)果,執(zhí)行當(dāng)前子函數(shù)剩余代碼
   print("a", "->", "c") 
  move(1, "a", "c", "b")
  n=1:
   print("a", "->", "b")
  move(1, "c", "a", "b")
  n=1:
   print("c", "->", "b")
   //到這里完成了a柱上面的n-1即是2個(gè)盤子的移動(dòng)
//開始把a(bǔ)柱上最后一個(gè)盤子移動(dòng)到c柱上
move(1, "a", "b", "c")
n=1:
 print("a", "->", "c")
 //到這里完成移動(dòng)a柱上的最后一個(gè)盤子到c柱上 
move(2, "b", "a", "c")
n=2:
//開始進(jìn)行n=2的第二個(gè)遞歸,即把當(dāng)前b('b')的盤子(n-1個(gè))通過(guò)a('a')移動(dòng)到c('c')上
 move(1, "b", "c", "a")
 n=1:
 //n=2 的第二個(gè)遞歸完成,打印結(jié)果并執(zhí)行當(dāng)前子函數(shù)的剩余代碼
  print("b", "->", "a")
 move(1, "b", "a", "c")
 n=1:
  print("b", "->", "c")
 move(1, "a", "b", "c")
 n=1:
  print("a", "->", "c")
  //到這里把b上的盤子通過(guò)a移動(dòng)到c,
//整個(gè)代碼執(zhí)行完畢,漢諾塔移動(dòng)完成

最后的打印結(jié)果為:

童鞋們理解了漢諾塔的遞歸算法原理后,可以寫個(gè)程序來(lái)試試,這里只是學(xué)到Python的遞歸所以用了Python,童鞋們可以用其他語(yǔ)言實(shí)現(xiàn),漢諾塔確實(shí)能幫助理解遞歸原理,遞歸在程序設(shè)計(jì)中的重要性不言而喻啦!

相關(guān)文章

  • PIL圖像處理模塊paste方法簡(jiǎn)單使用詳解

    PIL圖像處理模塊paste方法簡(jiǎn)單使用詳解

    這篇文章主要介紹了PIL圖像處理模塊paste方法簡(jiǎn)單使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python中的隨機(jī)數(shù)種子seed()用法說(shuō)明

    python中的隨機(jī)數(shù)種子seed()用法說(shuō)明

    這篇文章主要介紹了python中的隨機(jī)數(shù)種子seed()用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python編程快速上手——Excel到CSV的轉(zhuǎn)換程序案例分析

    Python編程快速上手——Excel到CSV的轉(zhuǎn)換程序案例分析

    這篇文章主要介紹了Python Excel到CSV的轉(zhuǎn)換程序,結(jié)合具體案例形式分析了Python操作Excel到CSV轉(zhuǎn)換的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Python可視化神器pyecharts繪制柱狀圖

    Python可視化神器pyecharts繪制柱狀圖

    這篇文章主要介紹了Python可視化神器pyecharts繪制柱狀圖,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-07-07
  • Python實(shí)現(xiàn)樹的先序、中序、后序排序算法示例

    Python實(shí)現(xiàn)樹的先序、中序、后序排序算法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)樹的先序、中序、后序排序算法,結(jié)合具體實(shí)例形式分析了Python數(shù)據(jù)結(jié)構(gòu)中樹的定義及常用遍歷、排序操作技巧,需要的朋友可以參考下
    2017-06-06
  • python 循環(huán)遍歷字典元素的簡(jiǎn)單方法

    python 循環(huán)遍歷字典元素的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇python循環(huán)遍歷字典元素的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Python中的xml與dict的轉(zhuǎn)換方法詳解

    Python中的xml與dict的轉(zhuǎn)換方法詳解

    這篇文章主要介紹了Python中的xml與dict的轉(zhuǎn)換方法詳解,xml 是指可擴(kuò)展標(biāo)記語(yǔ)言,一種標(biāo)記語(yǔ)言類似html,作用是傳輸數(shù)據(jù),而且不是顯示數(shù)據(jù)??梢宰远x標(biāo)簽,需要的朋友可以參考下
    2023-07-07
  • 使用python-Jenkins批量創(chuàng)建及修改jobs操作

    使用python-Jenkins批量創(chuàng)建及修改jobs操作

    這篇文章主要介紹了使用python-Jenkins批量創(chuàng)建及修改jobs操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05
  • Python Flask框架模板操作實(shí)例分析

    Python Flask框架模板操作實(shí)例分析

    這篇文章主要介紹了Python Flask框架模板操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python Flask框架使用Jinja2模板步驟及相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • python模塊shutil函數(shù)應(yīng)用示例詳解教程

    python模塊shutil函數(shù)應(yīng)用示例詳解教程

    這篇文章主要為大家介紹了python模塊中shutil函數(shù)的應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-10-10

最新評(píng)論

邓州市| 奉贤区| 舒兰市| 本溪| 民县| 连城县| 石棉县| 卫辉市| 邵阳县| 永新县| 启东市| 大港区| 潮州市| 宿州市| 平果县| 襄垣县| 永丰县| 榆林市| 日照市| 娱乐| 胶州市| 岑巩县| 通化市| 衡阳市| 静海县| 东宁县| 宜春市| 旺苍县| 江北区| 赤壁市| 云梦县| 金华市| 汤原县| 沁源县| 迭部县| 庄浪县| 格尔木市| 高淳县| 大兴区| 皮山县| 云安县|