1 說明
=====
1.1 漢諾塔:(又稱河内塔)問題是源于印度一個古老傳說的益智玩具。
1.2 大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天指令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次隻能移動一個圓盤。
1.3 用python3.8的turtle來實作遞歸可視化。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SYkJGZhNjM2QzMmFmNxQjYxYTNmBjYiBTZmJmMhFDZi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2 效果圖
3 感謝
=====
3.1 代碼來源
https://blog.csdn.net/beerbread134/article/details/69226991?utm_medium=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-baidujs-2.nonecase
3.2 對源代碼進行修改,增加,注釋,改進;順帶複習python和turtle的相關知識。
4 代碼講解HanoiTower.py
===================
4.1 第1和第2步
#第1步:導入子產品import turtle#第2步:初始化漢諾塔的層數n=int(input("請輸入漢諾塔的層數并回車:"))
4.2 第3步:堆砌stack類的設定
#第3步:堆砌stack功能函數:python類的複習class Stack: #初始化 def __init__(self): self.items = [] #柱子空的函數 def isEmpty(self): return len(self.items) == 0 #往外推push 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)
4.3 第4步:畫3根固定的柱子
#第4步:畫出漢諾塔的柱子:polesdef drawpole_bar(): t = turtle.Turtle() t.hideturtle() #柱子的顔色 t.color('red') def drawpole_bar(k): t.up() t.pensize(10) t.speed(100) t.goto(400*(k-1), 100) t.down() t.goto(400*(k-1), -100) t.goto(400*(k-1)-20, -100) t.goto(400*(k-1)+20, -100) drawpole_bar(0)#畫出漢諾塔的poles[0] drawpole_bar(1)#畫出漢諾塔的poles[1] drawpole_bar(2)#畫出漢諾塔的poles[2]
4.4 畫盤子,即層數有關的
#第5步:畫盤子disk==plates#漢諾塔的層數def creat_plates(n):#制造n個盤子 plates=[turtle.Turtle() for i in range(n)] for i in range(n): plates[i].up() #盤子的顔色設定 plates[i].color("green") plates[i].hideturtle() plates[i].shape("square") plates[i].shapesize(1,8-i) plates[i].goto(-400,-90+20*i) plates[i].showturtle() return plates
4.5 第6和第7步,堆砌和移動的函數
#第6步:#制造poles的堆砌stack的棧def pole_stack(): #調用stack這個大類 poles=[Stack() for i in range(3)] return poles#第7步:#把poles[fp]頂端的盤子plates[mov]從poles[fp]移到poles[tp]def moveDisk(plates,poles,fp,tp): mov=poles[fp].peek() plates[mov].goto((fp-1)*400,150) plates[mov].goto((tp-1)*400,150) l=poles[tp].size()#确定移動到底部的高度(恰好放在原來最上面的盤子上面) plates[mov].goto((tp-1)*400,-90+20*l)
4.6 遞歸實作
#第8步:#遞歸放盤子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)
4.7
#第9步:turtle視窗的設定和函數調用#執行個體化myscreen=turtle.Screen()#視窗标題名#myscreen.title('漢諾塔層數:{:.1f}'.format(n)) #浮點數myscreen.title('漢諾塔層數:%d'%(n)) #整數#背景顔色設定 myscreen.bgcolor('lightblue')#調用本地函數畫柱子drawpole_bar()#調用本地函數畫盤子plates=creat_plates(n)#調用本地函數,堆砌盤子poles=pole_stack()#4次for i in range(n): poles[0].push(i)#調用本地函數移動盤子moveTower(plates,poles,n,0,2,1)#點選視窗的關閉符号,進行關閉myscreen.exitonclick()
自己整理并分享。