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

汉诺(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 == 1)//递归的终点 
    move(source, target);
    else{
        //下面的代码是对文章开头步骤的复述
        hanio(n-1, source, target, temp);
        move(source, target);
        hanio(n-1, 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 = 3;
    hanio(num, 'A', 'B', 'C');
    return 0;
}
void hanio(int n, char source, char temp, char target)
{
    if(n == 1)//递归的终点 
        move(source, target);
    else{
    //下面的代码是对文章开头步骤的复述
        hanio(n-1, source, target, temp);
        move(source, target);
        hanio(n-1, 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又成了目标柱。。。

转载于:https://www.cnblogs.com/feicaixian/p/9721768.html

相关文章:

  • docker 系列 - Docker CheatSheet | Docker 配置与实践清单 (转载)
  • CentOS下rpm指令和yum指令详解
  • 微软产品大升级:Surface Pro 6、Studio 2、Laptop 2 重磅来袭
  • mysql8.0 Authentication plugin 'caching_sha2_password' cannot be loaded
  • PostgreSQL 函数式索引使用注意 - 暨非immutable函数不适合索引的原因
  • 零基础兴趣或者转行学习Python,我们应该如何入门呢?
  • bartender 9.4 错误消息6670 无法链接到数据库的解决办法
  • JVM G1笔记
  • Linux下切换用户出现su: Authentication failure的解决办法
  • [MicroPython]TPYBoard v102 CAN总线通信
  • Java多线程——AQS框架源码阅读
  • 超大数据下大批量随机键值的查询优化方案
  • node中的npm的使用
  • 未来五年中国本土机器人制造业将显著提升
  • RabbitMq之Work模式
  • 【347天】每日项目总结系列085(2018.01.18)
  • 10个确保微服务与容器安全的最佳实践
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • canvas 五子棋游戏
  • Django 博客开发教程 8 - 博客文章详情页
  • Docker: 容器互访的三种方式
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • MySQL-事务管理(基础)
  • PHP 7 修改了什么呢 -- 2
  • Python十分钟制作属于你自己的个性logo
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前端面试总结(at, md)
  • 物联网链路协议
  • 学习使用ExpressJS 4.0中的新Router
  • 移动端唤起键盘时取消position:fixed定位
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • C# - 为值类型重定义相等性
  • zabbix3.2监控linux磁盘IO
  • 正则表达式-基础知识Review
  • 昨天1024程序员节,我故意写了个死循环~
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • # 飞书APP集成平台-数字化落地
  • #HarmonyOS:Web组件的使用
  • #控制台大学课堂点名问题_课堂随机点名
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (27)4.8 习题课
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)pulsar安装在独立的docker中,python测试
  • (六)软件测试分工
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .htaccess配置常用技巧
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting