汉诺(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 递归实现)
汉诺塔简介 最近在看数据结构和算法,遇到了一个非常有意思的问题--汉诺塔问题. 先看下百度百科是怎么定义汉诺塔的规则的: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候 ...
随机推荐
- 0x04 Python logger 支持多进程日志按大小分割
目录 支持多进程日志按大小分割 多进程日志大小分割handler配置实例 支持多进程日志按大小分割 由于python内置模块logging.handlers.RotatingFileHandler是不 ...
- PacMan 03——追踪玩家
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- dedecms去掉标题长度限制
dedecms文章标题默认显示字数为60字节(30个汉字),如果想要显示更多要如何操作呢?两步解决问题,随ytkah一起来看看吧.1.后台找到“系统设置-系统基本参数-其他其他选项”(如下图)这时你可 ...
- 总结:几种生成html格式测试报告的方法
写自动化测试时,一个很重要的任务就是生成漂亮的测试报告. 1.用junit或testNg时,可以用ant辅助生成html格式: <target name="report" d ...
- HBase快照迁移数据失败原因及解决办法
目录 目录 1 1. 背景 1 2. 环境 1 3. 执行语句 1 4. 问题描述 1 5. 错误信息 2 6. 问题原因 3 7. 解决办法 4 1. 背景 机房裁撤,需将源HBase集群的数据迁移 ...
- pytest--运行指定的测试和参数化
mark pytest提供了标记机制,允许你使用marker对测试函数做标记,一个测试函数可以有多个marker,一个marker也可以用来标记多个测试函数 比如我们需要进行冒烟测试,不可能把所有的用 ...
- 三天精通Vue--Vue的常用语法
Vue的介绍 官网教程:https://cn.vuejs.org/v2/guide/installation.html 掘金:https://juejin.im/ cdn(在线的网络连接资源):htt ...
- 关于getClass(),Object.class,getClassLoader的理解
1.对Class类的理解:Class类包含了类的信息,如构造方法.方法.属性,可用于反射.以下是所有方法 2.获取Class类对象的几种方法: Test test = new Test(); (1). ...
- nginx1.16+php7.39配置笔记
vim /etc/nginx/conf.d/default.conf 修改php相关配置如下: location ~ \.php$ { root /usr/share ...
- javascript系列--认识并理解构造函数,原型和原型链
一.前言 介绍构造函数,原型,原型链.比如说经常会被问道:symbol是不是构造函数:constructor属性是否只读:prototype.[[Prototype]]和__proto__的区别:什么 ...