汉诺塔pythonturtle递归可视化
1 说明
=====
1.1 汉诺塔:(又称河内塔)问题是源于印度一个古老传说的益智玩具。
1.2 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
1.3 用python3.8的turtle来实现递归可视化。
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步:画出汉诺塔的柱子:poles def 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()
自己整理并分享。
丧偶式育儿我能坚持多久呢?关于丧偶式育儿,我真的不知道还能坚持多久,也不知道我能坚持到什么程度。周一到周五,孩子他爸上班,孩子的所有事宜我全权负责,周六日孩子爸说上班累要补觉,所以还是只有我和孩子同频道同节
一写作业,母慈子孝,居然在这里做到了一写作业拉屎拉尿喝水肚子疼蚊子咬分分钟想揍他(孩子)我们在朋友圈发现这样的文字,家有学生党,常常上演一部鸡飞狗跳家庭伦理武打剧。特别是最近疫情四起多地停课,孩子居家网课,很多家长哭
孕妈,产检做妊娠糖奶量试验,攻略看这南方网讯(记者张俊伟通讯员林惠芳)明天要空腹不能吃早餐来医院抽血,医生说要抽3次血,我好怕,我能受得了吗?一位年轻的孕妈拿着产检单,焦虑地询问旁边的丈夫。丈夫也一脸茫然,没事,我明
孕期玩手机不要做这五件事否则会伤害胎儿教育听我说孕期玩手机不能做这五件事才不会伤害胎儿。1。晚上睡觉的时候不要把手机放在枕头手机不能放在枕头上2。玩手机的时候不要把手机放在肚子上不要把手机放在肚子上3。不要经常把手机挂
儿童贫血不可乱补,这个汤才是最适合的铁是人体必须的微量营养元素之一,以微量存在于人体,却对维持人体生命活动具有重要的作用。铁是血红蛋白,肌红蛋白,细胞色素酶类和多种氧化酶的组成成分,它与血液中氧的运输和细胞内生物氧化
自感人生,如意与不如意自己常常在想,当从母亲的身上出来,成为初人的那一刻,应该是最无知的一声喊叫哇哇哇,这声音好似在说娃娃如意来到了人间,其实当个娃娃什么也不明白,这只是人生的初来,只有在吃到妈妈甜蜜的
建议家长别太省钱,春天是补钙黄金期,这6道菜多给孩子吃春季开始,万物复苏,不仅花草树木欣欣向荣起来,小朋友们也进入了生长发育最快的阶段。相信很多宝妈都知道,每年的36月,都是补钙的最佳阶段。如果家里的孩子达不到理想的身高,不妨抓住这个
男孩身上如果有三气,长大以后更有出息,你家儿子占了几个?不知道家长发现了没有,现在的孩子越来越娇气了,特别是有些男孩子抗挫能力弱,缺少了男孩本该有的坚强和阳刚劲儿。男孩长大后如果没有男孩气概,怕是很难出人头地吧!妈妈,这也太累了两个男娃
what!听说生了两个女儿的人就是人上人?这张图让我多盯了几眼并且开始对周围的家庭对号入座。没错,我就是生了两个闺女。怀孕期间从来没有咨询过性别问题,当然现在查得严,正规医院的b超室门口都贴一张纸禁止询问胎儿性别,没有熟人
你听说过哪些骇人听闻的真实事件?好几年前了,那是我妈和我说的了。我妈单位的一个女同事,那个同事生了一个小孩,老公去出差了吧好像。一天晚上她和孩子一块睡觉,晚上翻身的时候没注意,把孩子的脑袋压在了胳膊下面。早上起来
小孩子贪玩心很重怎么办?小孩子贪玩呢,是属于天性的,家长呢,也不要太过于担心。在这里呢,家长也要积极的去劝导孩子,尽量不要去打骂孩子,要不然会使孩子产生一种逆反的心理。在这里有几点可以参考一下1,第一点对