递归可视化之汉诺塔的动画实现(turtle海龟)

摘要:
importturtleclassStack:def__init__(self):self.items=[]defsEmpty(sell):returnlen(self.items)==0defpush(self,item):self.items.append(item)defpop
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():#画出汉诺塔的poles
    t = turtle.Turtle()
    t.hideturtle()
    def drawpole_1(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_1(0)#画出汉诺塔的poles[0]
    drawpole_1(1)#画出汉诺塔的poles[1]
    drawpole_1(2)#画出汉诺塔的poles[2]

def creat_plates(n):#制造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,8-i)
        plates[i].goto(-400,-90+20*i)
        plates[i].showturtle()
    return plates

def pole_stack():#制造poles的栈
    poles=[Stack() for i in range(3)]
    return poles

def moveDisk(plates,poles,fp,tp):#把poles[fp]顶端的盘子plates[mov]从poles[fp]移到poles[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)

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("请输入汉诺塔的层数并回车:
"))
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()

运行结果(层数为5):

递归可视化之汉诺塔的动画实现(turtle海龟)第1张

免责声明:文章转载自《递归可视化之汉诺塔的动画实现(turtle海龟)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇bootstrap-table中时间戳转换为日期格式。在Ubuntu 18.04系统上安装Pydio Cells详细图文教程下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C语言编程练习15:贴瓷砖

题目描述 有一块大小是 2 * n 的墙面,现在需要用2种规格的瓷砖铺满,瓷砖规格分别是 2 * 1 和 2 * 2,请计算一共有多少种铺设的方法。 输入 输入的第一行包含一个正整数T(T<=20),表示一共有T组数据,接着是T行数据,每行包含一个正整数N(N<=30),表示墙面的大小是2行N列。 输出 输出一共有多少种铺设的方法,...

ubuntu 查看文件编码并进行批量编码修改

由于windows下默认文件编码为gbk或者是gb2312,所以将windows下面的文件移到linux下时,常常会出现乱码的现象。 使用enca工具可以进行文件编码的查看。 ubuntu下enca的安装命令: 1 sudo apt-get installenca 2 3 4 enca查看文件 5 6 enca -L zh_CN file查看文件编码...

sql递归

--单表递归 由于项目中经常用到 , 随笔以作下次使用 例如:找ProductType表 下ID为1的分类的所有子级 with result as --result为别名(select * from TB_ProductType where Id=1 --查询ID为1 的数据union allselect TB_ProductType.* from tb...

根据ID和parentID利用Java递归获取全路径名称

如下图所示,本文参考资源:https://jie-bosshr.iteye.com/blog/1996607 感谢大佬的无私奉献。 思路:定义一个方法getParentName参数为int类型的configId,返回类型为String类型.在方法getParentName内部进行如下操作:1 根据当前节点configId查询数据库,得到一条记录,存入实体...

关于ASP.NET运行机制原理。。。个人总结

1.浏览器封装一个HTTP协议报文发送到服务器 2.服务器拿到请求后进行解析,若为HTML,CSS,JS等此类静态文件,则IIS直接进行查询,把文件封装后返回给客户端 3.①若请求为aspx,ashx等此类动态网页程序,IIS是处理不了的,IIS会交给自己的扩展AspNet_Isapi.dll,(其中I和S分别的代表intert ,serives),  ...

ASP.net MVC、Extjs多级目录(理论上可以无限级、非递归)treepanel显示和数据库(多级目录)存储结构的设计(上篇)

1、数据库(多级目录)存储结构的设计1.1、表设计           1.2、数据显示及相关信息: 升序:   select C.tre_parent,B.tre_name as tre_parentname,C.tre_children as tre_children,A.tre_name as tre_childrenname,C.tre_ch...