python 汉诺塔移动(turtle方法)

1,要求实现和线上移动汉诺塔过程

代码如下:

1 def hanoi(n, a, b, c):
2     if n == 1:
3         print(a, '-->', c)
4     else:
5         hanoi(n - 1, a, c, b)
6         print(a, '-->', c)
7         hanoi(n - 1, b, a, c)
8 # 调用
9 hanoi(5, 'A', 'B', 'C')

结果如下:

python 汉诺塔移动(turtle方法)

但是为了更好地看出汉诺塔的移动过程,我利用了python中的turtle进行绘制

2,用动画实现汉诺塔过程

代码如下:

1 def creat_plates(n):#制造n个盘子
 2     plates=[turtle.Turtle() for i in range(n)]
 3     for i in range(n):
 4         plates[i].up()
 5         plates[i].hideturtle()
 6         plates[i].shape("square")
 7         plates[i].shapesize(1,8-i)
 8         plates[i].goto(-400,-90+20*i)
 9         plates[i].showturtle()
10     return plates
11
12 def pole_stack():#制造poles的栈
13     poles=[Stack() for i in range(3)]
14     return poles
15
16 def moveDisk(plates,poles,fp,tp):#把poles[fp]顶端的盘子plates[mov]从poles[fp]移到poles[tp]
17     mov=poles[fp].peek()
18     plates[mov].goto((fp-1)*400,150)
19     plates[mov].goto((tp-1)*400,150)
20     l=poles[tp].size()#确定移动到底部的高度(恰好放在原来最上面的盘子上面)
21     plates[mov].goto((tp-1)*400,-90+20*l)
22
23 def moveTower(plates,poles,height,fromPole, toPole, withPole):#递归放盘子
24     if height >= 1:
25         moveTower(plates,poles,height-1,fromPole,withPole,toPole)
26         moveDisk(plates,poles,fromPole,toPole)
27         poles[toPole].push(poles[fromPole].pop())
28         moveTower(plates,poles,height-1,withPole,toPole,fromPole)
29
30 myscreen=turtle.Screen()
31 drawpole_3()
32 n=int(input("请输入汉诺塔的层数并回车:\n"))
33 plates=creat_plates(n)
34 poles=pole_stack()
35 for i in range(n):
36     poles[0].push(i)
37 moveTower(plates,poles,n,0,2,1)
38 myscreen.exitonclick()

结果如下:

python 汉诺塔移动(turtle方法)

Original: https://www.cnblogs.com/zzalovelyq/p/12970581.html
Author: 赖金明的大爹
Title: python 汉诺塔移动(turtle方法)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575404/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • HM2022ssm-mp3【DQL查询编程控制】

    条件查询 1.1 条件查询的类 MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合。 这个我们在前面都有见过,比如查询所有和分页查询的时候…

    Java 2023年6月5日
    099
  • Spring 5 源码解析-概述-1

    源地址 本篇文章基于spring-framework Release v5.3.5(7c2a72c) 版本进行源码分析。 官方源码地址: https://github.com/sp…

    Java 2023年6月6日
    0100
  • 编译原理的文法和语言总结与梳理

    梳理文法和语言的内容,理解与总结。 我们都知道,一种语言必定他的文法去描述,它的完整定义包括语法和语义两个方面。语言和语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使…

    Java 2023年6月7日
    097
  • 内部类

    内部类 基本介绍:一个类的内部又完整的嵌套了另一个类结构。被嵌套的类称为内部类(inner class)。是我们类的第五大成员[类的五大成员:属性、方法、构造器、代码块、内部类],…

    Java 2023年6月5日
    078
  • 网络编程详解

    1.1 概述 计算机网络:计算机网络是指将 地理位置不同的具有独立功能的 多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及 网络通信协议的管理和协调下,…

    Java 2023年6月6日
    080
  • 你知道怎么从jar包里获取一个文件的内容吗

    背景 报错的代码 原先的写法 编写测试类 找原因 最终代码 背景 项目里需要获取一个excle文件,然后对其里的内容进行修改,这个文件在jar包里,怎么尝试都读取不成功,但是觉得肯…

    Java 2023年6月8日
    0119
  • 日常踩坑_easyExcel导出一直报错org.apache.poi.ss.usermodel.Cell.setCellValue(Ljava/time/LocalDateTime

    背景提要 使用easyExcel进行Excel导出的时候,一直在报一个让人很崩溃的错,org.apache.poi.ss.usermodel.Cell.setCellValue(L…

    Java 2023年6月7日
    088
  • iOS 通过反射的方式调用目标函数

    1. 目标 工作中,需要解决这样一种问题,测试每一个目标接口的调用时间和返回值。逻辑较为通用,所以想使用反射来实现这种功能。 2. 背景知识 网上查了下,发现反射有两种实现方式,分…

    Java 2023年5月30日
    084
  • Android Calendar 系统日历提醒、日程同步系统

    安卓往系统中添加日程提醒,吭比较多。 首先有个需求(仿制 ios 日历),为什么仿制ios呢?这个得问产品了,我只是一个搬砖的程序员 (*´艸`) 捂嘴 大致有 日期,时间,重复设…

    Java 2023年6月7日
    099
  • Java 初识递归

    Java 递归 什么是递归 递归: 即在成员方法内调用自身 递归的优点 能用简洁的代码解决复杂的问题 递归的缺点 对内存的消耗大 递归的应用场景 当我们要获取一个结果,但是这个结果…

    Java 2023年6月5日
    098
  • 修改linux系统history命令的条数和格式

    原生的history命令,只能看到输入的命令历史,看不到什么时候,谁输入的。 特此在网上找到修改history命令的办法: 1.用root用户打开系统环境变量设置的文件 vim /…

    Java 2023年6月9日
    0108
  • Mysql进击篇-存储引擎、索引、sql优化、视图、锁、innoDb、管理

    1.存储引擎 (1)连接层最上层是一些客户端和连接服务,主要完成一些类似于连接处理,授权认证、以及相关的安全方案,服务器也会为安全接入的每个客户端验证它所具有的操作权限(2)服务层…

    Java 2023年6月8日
    087
  • vnpy源码阅读学习(2):学习PyQt5

    花费了一个下午把PyQt5大概的学习了下。找了一个教程 PyQt5教程 跟着挨着把上面的案例做了一遍,大概知道PyQt5是如何生成窗体,以及控件的。基本上做到如果有需求要实现,查查…

    Java 2023年6月7日
    081
  • spring boot jdbctemplate queryforstream 使用问题

    开发一个功能为了避免内存问题,使用了 jdbctemplate queryforstream,同时日常中会使用链接池,运行一段时间会出现链接超时的问题 参考示例代码 @RestCo…

    Java 2023年5月30日
    089
  • 反射 判断属性类型

    引用:http://blog.chinaunix.net/uid-26863299-id-3578280.html package com .cn .fanjg .rtti ; i…

    Java 2023年5月30日
    080
  • NO5 维护项目的软件开发方式解决方案 (设计三步之一)

    维护项目的软件开发方式解决方案 前言 参与这个项目有两周时间,项目为成熟系统的后期维护,主要开发内容为:系统的项目变更和功能的追加。 一:项目情况说明 系统是一个成熟的产品,分别出…

    Java 2023年6月8日
    072
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球