开头

学习c++到了递归这个地方,遇到了汉诺塔的问题,个人理解上感觉这个问题有点像动态规划,都是把问题去不断地分解,递归这里反复调用同一个方法来实现解决问题的操作,如果我要解决最终一个问题,那么我就把这个问题推导到它之前一步的问题,也就是说解决这个问题的方法就是将这个问题推导,推导的过程既是解决问题的过程也是连接解决问题不同步骤的过程。把这个过程表示出来然后不断的去引用直到一个终点(某一个标志),终点问题被解决然后不断地回溯直到最开始的问题。

汉诺塔问题Fig1

1.问题分解

汉诺塔问题就是把第一个杆上的圆盘全部挪到另外一个杆子上去,一次只能挪一个而且只能小的摞在大的上面。例如在上面的图里面,要把A柱子上的5个圆盘全都挪到B柱子上去,那么我们可以先把上面4个圆盘当作一个主体我叫它X,最下面一个叫Y,所以操作是stpe1 X:A 到C;step2 Y:A到B;step3 X:C到B。那么就把整体从A移到B推导成为了2个子问题(step1 and step3)和一个中间操作(step2),那么再来解决step1,把四个圆盘移动到C,依然用前面的X,Y的命名方式,那么就需要X移动到B然后Y移动到C,然后X移动到C,最终经过依此的分解就可以得到以下的一个粗略图。Fig2

箭头上的数字是每次移动的个数,这里没有分解完,每一个步骤的第三步都需要再次进行分解,例如第一步的C到B可以分解成为上面三个移动到A然后下面一个移动到B然后上面三个移动回B。通过上面的图也可以看出中间那一列既是操作的中间一步,也是我这一行操作最终完成的效果,比如第一行完成了5个模块从A到B的操作,这也给了我们一个提示那就是递归的终点的问题,递归的终点的时候应该是只有一个模块需要移动,所以中间的一步直接就是模块的移动,不需要再次进行递归的操作。

2.代码实现

对递归的过程以及终点分析后下一步就是代码的实现问题首先大致的框架应该是像下面Fig3

第二行和第四行的递归调用都是解决X的挪动问题,中间一行输出的是Y的挪动。但是注意在递归里面操作的方法都是一样的,在Fg2里面每一个步骤做的操作都是不同的,比如step1做的是A到B,step2做的是A到C的操作,递归的时候只能用一种方法,那么就可以做一个交换,把变量标识符的位置做一个交换,比如现在要移动5个圆盘,程序的第一步是要去调用F(4),在F(4)调用的时候把b和c的标识符对调,那么实际完成的就是从a到b的移动。

通过对字母的排列代表了圆盘的移动,为了能够统一在图二中的不同的step的操作(能用函数去表达和反复调用),这里把3个杆子代表的字母全都写出来:A,B,C,并且通过改变杆子的命名来实现不同的方法的统一,在这里A,B,C就代表了从A到C的操作,也就是中间一步的操作。在这里我也建议像我一样的小白可以按下面的图上的左边展示的关系去理解3根杆子的关系。

当然也可以按照一些教材上写的 把(a,b,c)理解成为从a借过b到c,也就是先把上面的移动到b,然后把下面的移动到c,然后再把上面的移动到c。

突然想啰嗦一点......就是在代码的含义

第一行我要实现5个圆盘从A移动到C的过程,第二行首先要实现从A到B的移动过程,第三行输出了在移动完X从A到B后Y的操作,也就是整个5个圆盘移动的中间操作,第四行X移动回来。这里整个F5这一行也就是这一个函数表示的方法就是 对于排列为A,B,C的字符串,从这么一个排列中,找到第一步要解决的问题(字符串的前两个),找到了这一行要解决的问题(字符串的第一个和第三个)而且也是中间步骤,然后输出,找到了第三步要解决的问题(字符的后两个),并规定了套路和方法和其实际产生的唯一结果(输出中间步骤也就是要解决的问题)。那么我在解决第一步的问题的时候只需要把B,C两个字符的位置在字符串中交换,那么这个方法就被用于解决从A到B移动圆盘的问题,然后再字符串前面加数字表示移动多少个圆盘。直到最后只有1个圆盘的时候就没有其他的步骤,中间一部就可以说明这个方法产生的结果所以可以直接得到输出语句并终止递归调用。

#include

using namespace std;

void HN(int n, char a, char b, char c)

{

if (n >= 1)

{

HN(n - 1, a, c, b);

cout << a << "--" << c << endl;

HN(n - 1, b, a, c);

}

}

int main()

{

int n;

cout << "please input the number of diskes" << endl;

cin >> n;

HN(n, 'A', 'B', 'C');

}

上面是我写的代码。

结尾

罗里吧嗦的写了一堆,也没讲清楚大佬用几句话就能说清的事情,惭愧,继续进步,继续加油吧。

怎么理解汉罗塔问题_小白理解的汉诺塔中的递归问题相关推荐

  1. matlab 功率谱密度 汉宁窗_如何理解随机振动的功率谱密度?

    一.随机信号和正太分布有什么关系? 二.时域.频域之间功率守恒? 三.自相关又是个什么玩意? 作为一个工程师,很多人对随机振动看着熟悉,却又实际陌生.熟悉是因为几乎每个产品在出厂时都要求要做随机振动试 ...

  2. python中的remove是什么意思_小白理解python中remove与del 的区别

    leetcode中的题目,感觉之前不太理解,就记录下来了. 题目:移动零,给定一个数组 nums, 编写一个函数将所有 0 移动到它的末尾,同时保持非零元素的相对顺序(Python3 环境). 例如: ...

  3. 全面理解java内存模型_深入理解Java内存模型(八)——总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  4. 完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器

    1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触 ...

  5. 深入理解java虚拟机章节_深入理解java虚拟机-第六章

    第6章 类文件 6.3 Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流. Class文件格式采用一种类似C语言结构伪结构存储数据,这种伪结构中只有两种数据类型:无符号数和表 ...

  6. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

  7. 深入理解python异步编程_深入理解Python异步编程

    1 什么是异步编程 1.1 阻塞程序未得到所需计算资源时被挂起的状态. 程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的. 常见的阻塞形式有:网络I/O阻塞.磁盘I/O ...

  8. 深入理解mysql百度网_深入理解mysql

    1.表的优化和列类型选择 表的优化 1,定长和变长分离 2,常用字段和不常用字段分离(不常用字段单独建表) 3,添加冗余字段提高查询(反范式查询(数据统计)) 列类型选择 1,字段类型选择优先级 整形 ...

  9. 如何通俗的理解函数的极限_如何理解函数的极限?

    一.首先来看数列的极限: 在学数列极限的时候,我们知道若这个数列有极限的话,在n无限增大时, 这个数列的通项公式收剑于一个数,即无限接近于这个数,我们把这个数叫做这个数列通项的极限. 例如:数列 An ...

最新文章

  1. OS X 10.11 cocoapods
  2. 使用SQL Server分区表功能提高数据库的读写性能
  3. java ip调天气预报接口_JAVA + WeatherWebService 实现天气预报接口调取
  4. la3401解码板_拆解SONY ST-V702收音头 更换调频收音板+频偏调整
  5. 基于CNN的中文文本分类算法(可应用于垃圾文本过滤、情感分析等场景)
  6. PTA : 函数题 7-3 两个有序链表序列的交集 (20 分)
  7. iOS底层探索之Block(一)——初识Block(你知道几种Block呢?)
  8. redis等缓存和mysql的数据同步问题解决思路
  9. Linux服务器远程连接
  10. 年薪45万阿里程序员想跳槽vivo,当他晒出期望工资,以为我看错了
  11. HDU 4125 Moles 二叉排序树 树状数组 kmp
  12. NVIDIA JETSON XAVIER NX TX2 NANO 比较及与显卡算力对比
  13. Java开发面试(持续更新)
  14. 班级页面设计——【2-主界面部分】
  15. 【内存泄露】LeakCanary常见问题
  16. DedeCMS-Dede伪原创自动采集发布
  17. sql数据处理的长尾问题及优化
  18. Python批量处理大量excel数据(含完整代码)
  19. 有约束多变量寻优方法——内点罚函数法
  20. 16款免费开源的商业智能工具

热门文章

  1. 05.SQL Server大数据群集小试牛刀--HDFS查询
  2. 做一个好女朋友的59条 ,你能做到几条?
  3. 为什么你的网站没流量?做不大!让我来告诉你。
  4. 职业生涯设计的10点忠告
  5. 联发科(MediaTek)Pentonic 电视芯片将率先支持杜比视界 IQ 精准细节功能
  6. 贾跃亭又造假,250亿灰飞烟灭!
  7. 苹果将明年上半年iPhone出货量目标提高 30%
  8. 1799元起!66W超级快充+120Hz全视屏 荣耀Play5 活力版正式发布
  9. 马斯克证实:特斯拉将加大在中国的投资和研发力度
  10. 王者荣耀回应服务器崩了:已处理完成 将陆续补发相应赔偿