一、由來:
漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
二、運算方法:
H⑴ = 1
H(n) = 2*H(n-1)+1 (n>1)
三、用Python實現漢諾塔的搬運過程:

運行結果:

四、用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(5)
t.speed(75)
t.goto(200*(k-1), 100)
t.down()
t.color('blue')
t.goto(200*(k-1), -100)
t.goto(200*(k-1)-20, -100)
t.goto(200*(k-1)+20, -100)
drawpole_1(0)#畫出漢諾塔的A
drawpole_1(1)#畫出漢諾塔的B
drawpole_1(2)#畫出漢諾塔的C
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,9-i)
plates[i].goto(-200,-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)*200,150)
plates[mov].goto((tp-1)*200,150)
l=poles[tp].size()
plates[mov].goto((tp-1)*200,-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=eval(input(""))
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()
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(5)
t.speed(75)
t.goto(200*(k-1), 100)
t.down()
t.color('blue')
t.goto(200*(k-1), -100)
t.goto(200*(k-1)-20, -100)
t.goto(200*(k-1)+20, -100)
drawpole_1(0)#畫出漢諾塔的A
drawpole_1(1)#畫出漢諾塔的B
drawpole_1(2)#畫出漢諾塔的C
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,9-i)
plates[i].goto(-200,-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)*200,150)
plates[mov].goto((tp-1)*200,150)
l=poles[tp].size()
plates[mov].goto((tp-1)*200,-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=eval(input(""))
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()
(PS:這段代碼是在網上找到后稍微改的,如有侵權,請告知,立馬刪)
運行結果:

