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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python汉诺塔问题

發布時間:2024/1/17 python 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python汉诺塔问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 漢諾塔問題是一個經典的問題。漢諾塔(Hanoi Tower),又稱河內塔,源于印度一個古老傳說。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,任何時候,在小圓盤上都不能放大圓盤,且在三根柱子之間一次只能移動一個圓盤。問應該如何操作?

  • ?

    將其問題分解尋找規律

  • b柱子作為輔助,把a上的63個圓盤移動到b
  • a上最后一個圓盤移動到c
  • a作為輔助,把b上的62個圓盤移動到a
  • b上的最后一個圓盤移動到c
  • 即每次都是先將其他圓盤移動到輔助柱子上,并將最底下的圓盤移到c柱子上,然后再把原先的柱子作為輔助柱子,并重復此過程。

    著名的斐波那契數列定義如下,可以看出,f(n)是由規模更小一些的f(n-1)和f(n-2)推導出來的:

    f(0)=0,f(1)=1
    f(n)=f(n-1)+f(n-2) (n>=2)

    因此,遞歸實際上就是用自己來定義自己。

    這個過程稱為遞歸,即定義一組基本操作,這組操作將規模小一點(或大一點)的操作當做一個整體——無需關心它的細節,只當它已經完成了——然后執行剩下的操作。而在更小或更大的規模中也依此操作,直到規模達到預定值。

    2.根據規律創建函數

    我們假設函數func(n, a, b, c)用于將n個圓盤由a移動到cb作為輔助柱子。那么我們可以這樣實現這個遞歸過程:

  • func:??
  • if?n!=0?then????????????;預定值??
  • ??func(n-1,?a,?c,?b)????;n-1個盤子由a移動到b,以c為輔助柱子(注意參數順序)??
  • ??move?a[n]?to?c????????;a上的最后一個盤子移動到c??
  • ??func(n-1,?b,?a,?c)????;n-1個盤子由b移動到c,以a為輔助柱子??
  • endif???????????????????;完成??
  • 3.結合turtle構建函數

  • import?turtle??
  • class?Stack:??
  • ????def?__init__(self):??
  • ????????self.items?=?[]??
  • ????def?isEmpty(self):??
  • ????????return?len(self.items)?==?0??
  • ????def?push(self,?item):??
  • ????????self.items.append(item)??
  • ????def?pop(self):??
  • ????????return?self.items.pop()??
  • ????def?peek(self):??
  • ????????if?not?self.isEmpty():??
  • ????????????return?self.items[len(self.items)?-?1]??
  • ????def?size(self):??
  • ????????return?len(self.items)??
  • def?drawpole_3():??
  • ????t?=?turtle.Turtle()??
  • ????t.hideturtle()??
  • ????def?drawpole_1(k):??
  • ????????t.up()??
  • ????????t.pensize(10)??
  • ????????t.speed(100)??
  • ????????t.goto(400*(k-1),?400)??
  • ????????t.down()??
  • ????????t.goto(400*(k-1),?-100)??
  • ????????t.goto(400*(k-1)-20,?-100)??
  • ????????t.goto(400*(k-1)+20,?-100)??
  • ????drawpole_1(0)??
  • ????drawpole_1(1)??
  • ????drawpole_1(2)??
  • def?creat_plates(n):??
  • ????plates=[turtle.Turtle()?for?i?in?range(n)]??
  • ????for?i?in?range(n):??
  • ????????plates[i].up()??
  • ????????plates[i].hideturtle()??
  • ????????plates[i].shape("square")??
  • ????????plates[i].shapesize(1,20-i)??
  • ????????plates[i].goto(-400,-90+20*i)??
  • ????????plates[i].showturtle()??
  • ????return?plates??
  • def?pole_stack():??
  • ????poles=[Stack()?for?i?in?range(3)]??
  • ????return?poles??
  • def?moveDisk(plates,poles,fp,tp):??
  • ????mov=poles[fp].peek()??
  • ????plates[mov].goto((fp-1)*400,550)??
  • ????plates[mov].goto((tp-1)*400,550)??
  • ????l=poles[tp].size()??
  • ????plates[mov].goto((tp-1)*400,-90+20*l)??
  • def?moveTower(plates,poles,height,fromPole,?toPole,?withPole):??
  • ????if?height?>=?1:??
  • ????????moveTower(plates,poles,height-1,fromPole,withPole,toPole)??
  • ????????moveDisk(plates,poles,fromPole,toPole)??
  • ????????poles[toPole].push(poles[fromPole].pop())??
  • ????????moveTower(plates,poles,height-1,withPole,toPole,fromPole)??
  • myscreen=turtle.Screen()??
  • drawpole_3()??
  • n=int(input("請輸入漢諾塔的層數并回車:\n"))??
  • plates=creat_plates(n)??
  • poles=pole_stack()??
  • for?i?in?range(n):??
  • ????poles[0].push(i)??
  • moveTower(plates,poles,n,0,2,1)??
  • myscreen.exitonclick()??
  • 4.將該代碼輸入python并運行

    運行過程如下圖

    ?

    ?

    ?

    轉載于:https://www.cnblogs.com/z2273533704/p/10612072.html

    總結

    以上是生活随笔為你收集整理的Python汉诺塔问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。