汉诺(hanio)塔问题
规则:大盘子不能压在小盘子上。
要求:将A柱子上所有盘(每个盘大小不同)放到C柱子上,使用B柱子作辅助。
比如柱子A上有n个盘,执行以下步骤:
1. 把n-1个盘从源柱移动到临时柱上;
2. 把源柱上剩余的1个盘移动到目标柱上;
3. 把临时柱上的n-1个盘移到目标柱上。
显然,以上步骤将问题的规模缩小了一点。没有直接移动n个盘,而是移动n-1个盘。
那么,对于任务1和任务3来说,其性质显然和原问题是一样的,只是需要移动的盘子的数量减少了。
那么,对于任务1和任务3,可以用解决原问题的方法解决它们。这样不断重复下去,问题规模不断缩小,到最后变成了举手之劳,这样形成了递归模型。递归模型为hanio(int n, char source, char temp, char target)。num为当前任务需要移动的盘子的个数,source, temp, target用于指定三种类型的柱子。
为了写出代码,拿任务1作具体演绎:
1.1把n-1个盘从源柱移动到临时柱上;
2.1把n-2个盘从源柱移动到临时柱上;
3.1把n-3个盘从源柱移动到临时柱上;
…
3.2把源柱上剩余的1个盘移动到目标柱上;
3.3把临时柱上的n-3个盘移到目标柱上。
2.2把源柱上剩余的1个盘移动到目标柱上;
2.3把临时柱上的n-2个盘移到目标柱上。
1.2把源柱上剩余的1个盘移动到目标柱上;
1.3把临时柱上的n-1个盘移到目标柱上。
移动是在两个位置之间移动,因此只需要两个参数。定义第一个参数位置始终为每个步骤的起点,第三个参数位置始终为每个步骤的终点。变量source, temp, target的初值分别为'A', 'B', 'C'。
递归的终点是:把1个盘从源柱移动到目标柱上。
void hanio(int n, char source, char temp, char target)
{
if(n == )//递归的终点
move(source, target);
else{
//下面的代码是对文章开头步骤的复述
hanio(n-, source, target, temp);
move(source, target);
hanio(n-, temp, source, target);
}
}
完整代码如下:
#include <stdio.h>
void hanio(int n, char source, char temp, char target);
void move(char x, char y); int main()
{
int num = ;
hanio(num, 'A', 'B', 'C');
return ;
}
void hanio(int n, char source, char temp, char target)
{
if(n == )//递归的终点
move(source, target);
else{
//下面的代码是对文章开头步骤的复述
hanio(n-, source, target, temp);
move(source, target);
hanio(n-, temp, source, target);
}
} void move(char x, char y)
{
printf("%c--->%c\n", x, y);
}
不建议继续作微观思考,显然模型已经构造完毕。如果非要深入演绎,此处可以举个例子。
从上往下看,先看第一个任务:把n-1个盘从源柱移动到临时柱上。
这个任务重新表述为:把n-1个盘从源柱A移动到临时柱B上。
由于要达成把n-1个盘从源柱移动到临时柱B上这个目标,原问题中的临时柱B显然已经成为了本任务中的目标柱,而C柱本来在原问题中是目标柱,现在在这个任务中也就成了临时柱,源柱是A柱。
这里B和C发生了交换。A--源柱,B--目标柱,C--临时柱。
为了完成第一个任务,先要完成第二个任务:把n-2个盘从源柱移动到临时柱上。
我们来看第二个任务。
这个任务重新表述为:把n-2个盘从源柱A移动到临时柱C上。
在这个任务中,C柱俨然是目标柱,而B柱只好是临时柱了。
A--源柱,B---临时柱,C-目标柱。
这里,B和C又发生了交换,角色换回来了,和原问题的各柱扮演的角色一样,这样不断交换下去。
不信看第三个任务:把n-3个盘从源柱移动到临时柱上。
这个任务重新表述为:把n-2个盘从源柱A移动到临时柱B上。
那么B又成了目标柱。。。
汉诺(hanio)塔问题的更多相关文章
- ACM1997_汉诺栽塔VII
#include <stdio.h> #include <iostream> #include <queue> #include <stdlib.h> ...
- 汉诺塔(Hanoi)——小小算法
传送门: 袁咩咩的小小博客 汉诺(Hanoi)塔源于古印度,是非常著名的智力趣题,大意如下: 勃拉玛是古印度的一个开天辟地的神,其在一个庙宇中留下了三根金刚石的棒,第一 根上面套着64个大小不一的圆形 ...
- Hanio汉诺塔代码递归实现
1.背景介绍 Hanio (汉诺塔,又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘 ...
- JS经典面试题汉诺塔
我爱撸码,撸码使我感到快乐!大家好我是Counter.今天给大家分享的是利用JS将汉诺塔原理实现出来,其实主要是考察一个递归的思想,复杂的问题简单化,汉诺塔应该都知道吧,具体的游戏规则,可以百度查查, ...
- 汉诺塔问题-递归实现-JAVA
public class hanio { /** * @param args */ public static void main(String[] args) { // TODO Auto-gene ...
- Python汉诺塔问题递归算法与程序
汉诺塔问题: 问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱 ...
- java实现组合数_n!_杨辉三角_组合数递推公式_回文数_汉诺塔问题
一,使用计算机计算组合数 1,设计思想 (1)使用组合数公式利用n!来计算Cn^k=n!/k!(n-k)!用递推计算阶乘 (2)使用递推的方法用杨辉三角计算Cn+1^k=Cn^k-1+Cn^k 通过数 ...
- JAVA——汉诺塔
大家还记得某年春晚小品那个把大象放冰箱需要几步吗? 今天,我准备写的是汉诺塔,有三个魔法石柱,分别:诚实.勇敢.正直.其中有一个石柱上从大到小,从地向上依次排放着四个魔法圆环,需要将那四个魔法圆环分别 ...
- js 递归 汉诺塔的例子
程序调用自身的编程技巧称为递归. //汉诺塔的游戏,n为圆盘编号数量,编号,a,b,c代表的是三个柱子 var hanio=function(n,a,b,c){ if(n>0){ ...
- 图解汉诺塔问题( Java 递归实现)
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...
随机推荐
- Django ORM (二) 增加操作
数据库表结构生成完毕后,可以使用工具连接上去 在 app01_author 表创建基础记录 在 app01_publisher 表创建基础记录 添加 data_oper 方法 在 urls.py 文件 ...
- snowflake时间回退问题思考
算法比较简单,每个id-generator负责生成的ID由3部分组成,41位时间戳可以表示到毫秒,10bit worker-id内部可自行划分,比如3位表示IDC,7位表示机器.最后12位是在一毫秒的 ...
- 压缩,解压缩 和tar详细介绍
文件压缩/解压缩 gzip bzip2 xz 只能压缩文件,不能压缩文件夹(压缩完后,文件会消失) 先建三个文件来进行演示 touch ./{1..3}.txt 文件已经创建好,下面就开始介 ...
- django-配置404页面
setting.py文件配置 # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False ALLOW ...
- 嵌入式linux开发uboot启动内核的机制(二)
一.嵌入式系统的分区 嵌入式系统部署在Flash设备上时,对于不同SoC和Flash设备,bootloader.kernel.rootfs的分区是不同的.三星S5PV210规定启动设备的分区方案如下: ...
- C#中的函数(三)参数传递及返回值
接前面二篇,继续开始新的研究 前面忘了说什么是主调函数与被调函数 主调函数:执行调用其它函数语句所在的函数 被调函数:被其它函数所调用的函数 简单说就是一个是发起调用者,另一个是被调用者 写个小例子说 ...
- N种自动化测试框架(包含自动化和性能,总有一款适合你)
不知不觉,分享的框架已经6个了(准确说应该是4个),仅仅是接口的. 这些框架都是最基础的框架,需要根据实际使用场景进行完善,大家就当练手实践吧. 不需要写代码的自动化框架 JMeter + Ant+ ...
- linux防止恶意采集攻防战
这两天ytkah开发的一个中大型项目被人盯上了,网站打开非常慢,查看了一下cpu.内存使用情况,30%左右占用不高,网络上下行就比较大了,IO实时流量达到40MB,IO总流量更是7TB,非常大的数据量 ...
- 5-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(配置MQTT的SSL证书,验证安全通信)
4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案安全篇(为域名申请SSl证书) 前面的准备工作终于完了 复制这两个证书 放到云端MQTT的这个位置,其实放哪里都可以 ...
- HTML 超链接返回上一级
参考:http://blog.csdn.net/huanongjingchao/article/details/39587663 超链实现返回刚刚访问的网页: <a href="#&q ...