1 n=input("输入汉诺塔碟子总数")
2 def move(n,a,b,c):
3 if n==1:
4 print(a,'->',c)
5 else:
6 move(n-1,a,c,b)
7 move(1,a,b,c)
8 move(n-1,b,a,c)
9
10 动图:
11 import turtle
12 class Stack:
13 def __init__(self):
14 self.items = []
15 def isEmpty(self):
16 return len(self.items) == 0
17 def push(self, item):
18 self.items.append(item)
19 def pop(self):
20 return self.items.pop()
21 def peek(self):
22 if not self.isEmpty():
23 return self.items[len(self.items) - 1]
24 def size(self):
25 return len(self.items)
26
27 def drawpole_3():#画出汉诺塔的poles
28 t = turtle.Turtle()
29 t.hideturtle()
30 def drawpole_1(k):
31 t.up()
32 t.pensize(10)
33 t.speed(100)
34 t.goto(250*(k-1), 100)
35 t.down()
36 t.goto(250*(k-1), -100)
37 t.goto(250*(k-1)-20, -100)
38 t.goto(250*(k-1)+20, -100)
39 drawpole_1(0)#画出汉诺塔的polesA
40 drawpole_1(1)#画出汉诺塔的polesB
41 drawpole_1(2)#画出汉诺塔的polesC
42
43 def creat_plates(n):#制造n个盘子
44 plates=[turtle.Turtle() for i in range(n)]
45 for i in range(n):
46 plates[i].up()
47 plates[i].hideturtle()
48 plates[i].shape("square")
49 plates[i].shapesize(1,9-i)
50 plates[i].goto(-250,-90+20*i)
51 plates[i].showturtle()
52 return plates
53
54 def pole_stack():#制造poles的栈
55 poles=[Stack() for i in range(3)]
56 return poles
57
58 def moveDisk(plates,poles,fp,tp):#把polesA顶端的盘子plates[mov]从polesA移到polesC
59 mov=poles[fp].peek()
60 plates[mov].goto((fp-1)*250,150)
61 plates[mov].goto((tp-1)*250,150)
62 l=poles[tp].size() #确定移动到底部的高度(恰好放在原来最上面的盘子上面)
63 plates[mov].goto((tp-1)*250,-90+20*l)
64
65 def moveTower(plates,poles,height,fromPole, toPole, withPole):#递归放盘子
66 if height >= 1:
67 moveTower(plates,poles,height-1,fromPole,withPole,toPole)
68 moveDisk(plates,poles,fromPole,toPole)
69 poles[toPole].push(poles[fromPole].pop())
70 moveTower(plates,poles,height-1,withPole,toPole,fromPole)
71
72 myscreen=turtle.Screen()
73 drawpole_3()
74 n=int(input("请输入汉诺塔的层数并回车:\n"))
75 plates=creat_plates(n)
76 poles=pole_stack()
77 for i in range(n):
78 poles[0].push(i)
79 moveTower(plates,poles,n,0,2,1)
80 myscreen.exitonclick()