生活随笔
收集整理的這篇文章主要介紹了
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移動到c,b作為輔助柱子。那么我們可以這樣實現這個遞歸過程:
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汉诺塔问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。