目录

  • 1 Python 环境搭建(2课时)
    • 1.1 授课计划、实验计划
    • 1.2 概述
    • 1.3 安装
    • 1.4 代码编写
    • 1.5 章节测验1
  • 2 初始 Python(4课时)
    • 2.1 语法规则
    • 2.2 数字
    • 2.3 字符串
    • 2.4 运算符
    • 2.5 文件操作
    • 2.6 章节测验2
  • 3 Python 数据结构(4课时)
    • 3.1 列表
    • 3.2 元组
    • 3.3 字典
    • 3.4 集合
    • 3.5 章节测验3
  • 4 Python 基本语句(2课时)
    • 4.1 赋值语句
    • 4.2 条件语句
    • 4.3 循环语句
    • 4.4 解析式
    • 4.5 章节测验4
  • 5 Python 基本函数(2课时)
    • 5.1 函数的定义
    • 5.2 函数的参数
    • 5.3 特殊函数
    • 5.4 作用域
    • 5.5 章节测验5
  • 6 Python 类与对象(2课时)
    • 6.1 类的定义
    • 6.2 类的私有化
    • 6.3 类的继承
    • 6.4 章节测验6
  • 7 Python 异常处理(2课时)
    • 7.1 异常类型
    • 7.2 异常处理
    • 7.3 章节测验7
  • 8 Python 模块与包(2课时)
    • 8.1 模块和包
    • 8.2 常见标准库
    • 8.3 章节测验8
  • 9 Python 第三方库(6课时)
    • 9.1 Numpy(1课时)
    • 9.2 Pandas(3课时)
    • 9.3 Matplotlib(2课时)
    • 9.4 tkinter 入门*(2课时)
    • 9.5 Django 入门*(2课时)
    • 9.6 Pygame 入门*(2课时)
    • 9.7 章节测验9
  • 10 正则表达式与网络爬虫*(4课时)
    • 10.1 正则表达式入门
    • 10.2 网络爬虫入门
    • 10.3 爬虫示例
    • 10.4 章节测验10
  • 11 Python 数据库*(2课时)
    • 11.1 SQLite 入门
    • 11.2 SQLite 示例
    • 11.3 章节测验11
  • 12 Python 课程实验(16课时)
    • 12.1 实验1  Python集成开发环境搭建
    • 12.2 实验 2  Python 数据类型
    • 12.3 实验 3  Python 循环结构
    • 12.4 实验 4  Python 函数
    • 12.5 实验 5 Python 类与模块
    • 12.6 实验 6  Python 文件操作
    • 12.7 实验 7  Python 计算生态(3)
    • 12.8 实验 8  Excell 数据导入数据库(选修)
  • 13 Python 实战案例*(基础篇)
    • 13.1 Python实战之 n 个自然数的立方和
    • 13.2 Python实战之随机列表的生成与排序
    • 13.3 Python实战之1--10阶乘和
    • 13.4 Python实战之猜数字小游戏
    • 13.5 Python实战之模拟客户登录账户
    • 13.6 Python实战之约瑟夫生者死者小游戏
    • 13.7 Python实战之计算圆周率PI
    • 13.8 Python实战之超级素数
    • 13.9 Python实战之打印菱形
    • 13.10 Pyhton实战之汉诺塔问题**
  • 14 Python 实战案例**(进阶篇)
    • 14.1 金融时间序列的可视化分析
    • 14.2 新冠肺炎实时数据爬取及可视化分析
  • 15 Python 就业指导
    • 15.1 工程师
    • 15.2 分析师
    • 15.3 全国计算机等级考试二级大纲之Python语言程序设计
    • 15.4 量化金融分析师(AQF)
  • 16 模拟试卷
    • 16.1 模拟试卷(一)
    • 16.2 模拟试卷(二)
  • 17 附录
    • 17.1 jupyter notebook网页端无法自动弹出?
    • 17.2 插件 Nbextension 的安装
Pyhton实战之汉诺塔问题**

参考资料:


案例10:Python实战 之 汉诺塔问题(选做)

传说古老印度在一个圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片圣庙,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片,一次只移动一片,不管在哪根针上,小片必在大片上面。当所有的金片都从梵天穿好的那根针上移到另外一概针上时,世界就将在一声霹雳中消灭,梵塔、庙宇和众生都将同归于尽。


  • 游戏规则:从左到右 A B C 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面。

  • 案例1(n=1):只有一个盘子时,则直接有A,移动到C 完成。

  • 案例2(n=2):如果有两个盘子时,移动方案如下

A—>B   #借助B,帮助C拿到最后一个盘子

A—>C   #最后一个盘子移动完成后,剩余的盘子已经全部到B上了

B—>C   #将剩余的盘子移动到C上,完成

  • 案例3(n=3):如果有三个盘子,盘子数量N = 3,移动方案如下

  • 案例4(n=4):如果有四个盘子,盘子数量N = 4,移动方案如下

案例分析

  • 当盘子只有一个是,即N=1,只有一个动作,从A移动到C即结束

  • 当有N个盘子时:

上半部分: 移动一定和n-1盘子移动时的动作相同。出发地都是A,只不过,n-1个盘子移动的目的是B,而不是C。这样方便取出最后一个盘子;

中间部分: 一定是由A移动到C;

下半部分: 此时等待移动的盘子已经都在B上,而不是A上,移动步骤类似于n-1个盘子的移动。出发地是B,目的地是C。


递归分析

如果想要移动n个盘子到指定目的,那么一定要先将n-1个盘子移动到备用柱上。

当n-1个盘子移动后,必定要将最后一个盘子移动到C上。

经过上面的调换后,剩下待处理的盘子还有n-1个,此时盘子已经在B上而不是在A上。此时需要从新判断剩余的盘子个数。如果依然大于1个那么还是需要按照1的步骤移动第n-1个盘子之上的所有盘子共n-2到A上。从而好让第n-1个盘子从B移动到C。

总结:到第3步时,发现有和第一步第二步类似地方。只需要改变盘子的出发点和目的点,就能刚好递归。



def move(n,a,b,c):
   if n == 1:
       print(a,"-->",c)
   else:
       move(n-1,a,c,b)
       print(a,"-->",c)
       move(n-1,b,a,c)
       
move(4,"A","B","C")