使用C/C++使用递归实现汉诺塔问题

开学到现在学了很久C++,目前还是很弱…最近对汉诺塔问题挺感兴趣,记下自己第一篇博客。
首先是汉诺塔问题的解决原理,从上高中学习我们很容易从特例中找出一般的规律,对于A柱上有n个圆盘,则共需移动的次数为n^2-1次(试几次就能找出规律),不过直接这样好像不大负责。
我去找了处理办法,最直观的就是“品字解决法”(原谅我简单粗暴的命名),大致可概括如下:
(1)按圆盘奇偶性确定三根柱子的排列方式,奇逆偶顺,标好ABC排成品字。
(2)把圆盘1按顺序移到下一根柱子
(3)把非空柱子的圆盘移到空柱子上,没有空柱子则移动小的到另一个没有圆盘1的柱子上
(4)重复(2)(3)的步骤直至完成
个解决办法大体上还是很容易理解的,但是我后来发现别人的代码都没用它解决。而这个想法具体的进行代码表达我还不行。
----**-----------------
而解决此类问题的常用代码角度是:
当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。
当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C塔上。
当A塔上有3个盘子时,先将A塔上编号1至2的盘子(共2个)移动到B塔上(需借助C塔),然后将A塔上的3号最大的盘子移动到C塔,最后将B塔上的两个盘子借助A塔移动到C塔上。
当A塔上有n个盘子是,先将A塔上编号1至n-1的盘子(共n-1个)移动到B塔上(借助C塔),然后将A塔上最大的n号盘子移动到C塔上,最后将B塔上的n-1个盘子借助A塔移动到C塔上。
综上所述,除了只有一个盘子时不需要借助其他塔外,其余情况均一样。
------------------**********
根据递归函数定义很容易得在使用一个函数过程中又出现直接或者间接地调用函数本身,称为函数的递归调用。就是大概这个样子了使用C/C++使用递归实现汉诺塔问题
使用C/C++使用递归实现汉诺塔问题
汉诺塔问题据说被誉为递归问题的经典范例,对于很多像我一样的小白来说,如何解读它也是一个不小的问题,所以我现在写下来代码具体的解读,(太多会比较复杂,这里采用n=3进行具体解读。)
n=3,首先解决第一句语句hanoi(2,A,C,B)所以执行这个语句的代码实现为:
hanoi(1,A,B,C);move(A,B);hanoi(1,C,A,B)
则此时hanoi(2,A,C,B)的输出为(A->C A->B C->B)
然后继续向下执行,move(A,C)此时输出(A->C)
接着hanoi(2,B,A,C)从第一句输出结果相同的(B->A B->C A->C)
所以最终的结果是A->C A->B C->B A->C B->A B->C A->C
这么算下来多难的问题都能解决了,只是需要很多步骤,复杂度会很高。
最后挂两个百度连接吧,觉得挺有用的汉诺塔c++代码详细解读
汉诺塔问题的详细解读