当前位置: 首页 > news >正文

汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)

汉诺塔问题

 

1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘,只能移动在最顶端的圆盘。

 

 

2.问题分析:

汉诺塔问题的以下几个限制条件:
1.在小圆盘上不能放大圆盘。
2.在三根柱子之间一回只能移动一个圆盘。
3.只能移动在最顶端的圆盘。
 
案例 1 - 假设只有一个盘子的时候, 盘子数量 N=1
 
只有一个步骤   将第1个盘子从A移动到C, 为了对比方便我这样来描述这个步骤:
 
步骤  盘子编号 从柱子移动   移动到柱子
 
1       1                A               C
 
案例 2 - 如果有两个盘子, 盘子数量 N = 2
 
步骤  盘子编号 从柱子移动   移动到柱子
 
1              1                A               B
 
2              2                A               C
 
3              1                B               C
 
案例 3  - 如果有三个盘子, 盘子数量 N = 3
 
步骤      盘子编号     从柱子移动     移动到柱子
 
1                1       A                     C
 
2                2       A           B
 
3                1              C                     B
 
4                3              A                    C
 
5                1              B                    A
 
6                2              B                    C
 
7                1              A                    C   
 
观察第3个案例中的第 1-3 步 和 第 5-7步
 
第 1-3 步 目的是从 A 移动到 B   如果我们把 B 当作终点, 那么这里的第 1-3 步理解起来和 第2个案例的三个步骤完全相同
 
1       1     A           C     ( A -> B)
 
2       2     A        B     ( A -> C)
 
3       1              C           B      ( B -> C)
 
总结:将盘子B变成C即可.
第 5-7 步 目的是从 B 移动到 C   如果我们把 C 当作终点, 那么这里的 5-7 步理解起来和上面也是一样的, 和第2个案例的三个步骤也完全相同.和第2个案例比起来就是:
 
5       1       B           A    ( A -> B)
 
6       2       B           C    ( A- > C)
 
7       1       A           C    ( B -> C)
 
 
 
总结: 将盘子B变成A即可
 
根据这个演示可以明确几点规律:
 
1. 当盘子只有一个的时候,只有一个动作 从 A 移动到 C 即结束.
 
2. 当有N个盘子的时候, 中间的动作都是从 A 移动到 C, 那么表示最下面的第N个盘子移动完毕
 
3. 中间动作之上都可以认为是: 从 A 移动到 B
 
4. 中间动作之下都可以认为是: 从 B 移动到 C
 
 
 
3.代码实现
 
 
 1 # -*- coding: utf-8 -*-
 2 # Hanoi_Tower.py
 3 # @author  0yst3r
 4 # @description
 5 # @created Tue Apr 16 2019 11:25:35 GMT+0800 (中国标准时间)
 6 # @last-modified Tue Apr 16 2019 14:29:13 GMT+0800 (中国标准时间)
 7 #
 8 
 9 i = 0
10 
11 
12 def Num():
13     global i
14     i = i + 1
15     return i
16 
17 
18 def move(n, a, b, c):
19     if n == 1:
20         print(a, '->', c)
21         Num()
22 
23     else:
24         move(n - 1, a, c, b)
25         print(a, '->', c)  # move(1, a, b, c)
26         move(n - 1, b, a, c)
27         Num()
28 
29 
30 n = eval(input("请输入盘子的个数:"))
31 print('移动步骤如下:')
32 print(move(n, 'A', 'B', 'C'))
33 print('移动总次数为:', i)

运行结果:

输入 n=3

 

 
 4.参考资料
https://www.cnblogs.com/antineutrino/p/3334540.html
https://blog.csdn.net/liujian20150808/article/details/50793101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/0yst3r-2046/p/10716970.html

相关文章:

  • 数据库(MySQL)
  • Hive分桶
  • 第三章:内存分配与回收策略
  • visual studio 命令行 build
  • 摘要商城总结
  • StringBuufer与StringBulder线程的区别
  • 微信分享到朋友圈,怎么自定义分享的标题,图片,内容?
  • BZOJ2300[HAOI2011]防线修建——非旋转treap+凸包(平衡树动态维护凸包)
  • 今日学习20190425
  • MAYA 卸载工具,完美彻底卸载清除干净maya各种残留注册表和文件
  • 跨域的理解,以及解决方案!
  • Android进阶:七、Retrofit2.0原理解析之最简流程
  • 20190422 Gitlab Jenkins 的搭建及准备web页面
  • 构建可靠系统的原则与实践
  • 论数据集成技术的演变和发展2/3
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • HTML5新特性总结
  • java2019面试题北京
  • php的插入排序,通过双层for循环
  • php中curl和soap方式请求服务超时问题
  • springboot_database项目介绍
  • Sublime Text 2/3 绑定Eclipse快捷键
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • zookeeper系列(七)实战分布式命名服务
  • 机器学习学习笔记一
  • 实现简单的正则表达式引擎
  • 使用 Docker 部署 Spring Boot项目
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 我有几个粽子,和一个故事
  • 移动端 h5开发相关内容总结(三)
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • ​你们这样子,耽误我的工作进度怎么办?
  • #图像处理
  • $.ajax()参数及用法
  • (3)llvm ir转换过程
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)kafka实战——kafka源码编译启动
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • .gitignore文件设置了忽略但不生效
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net wcf memory gates checking failed
  • .NET6 命令行启动及发布单个Exe文件
  • .Net6使用WebSocket与前端进行通信
  • .project文件
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @property @synthesize @dynamic 及相关属性作用探究
  • @property括号内属性讲解
  • [ 网络基础篇 ] MAP 迈普交换机常用命令详解
  • []Telit UC864E 拨号上网
  • [1204 寻找子串位置] 解题报告
  • [AutoSAR 存储] 汽车智能座舱的存储需求