怀着一颗菜鸟的心小心翼翼的写着我的第一个博客,也是仅仅记录下我学习的过程,正如我的个人说明那样,一天进步一点点,还望多多指正。
本来想一下子浏览完《C++程序设计》面向对象之前的部分,毕竟之前在课上好好学过C,有一定的C基础,但在浏览到递归这一章的时候,突然就被汉诺塔卡了好几天,不过好在在今天弄明白了,于是马不停蹄的赶紧把它记录下来,希望今后对自己有用吧。
先把程序上了:
#include
using namespace std;
void moveDisks(int n,char fromTower,char toTower,char auxTower)
//函数的功能是寻找在借助auxTower下将n个盘子从fromTower移动到toTower的方法
{
if(n==1)
cout<<"Move desk "<
<<" from "<
<<" to "<
<
一开始总是纠结在那个参数的问题上,老是想为啥调用moveDisks的时候,当n为2时,n-1不就是1吗,不就停止了吗,哪有后来的代码了。我觉得moveDisks函数就是当n为2的一个循环,即最小执行单位,只要搞懂了他们的调用基本上就理解了,就能用递归的方法写出来。 其实此问题的基本情况是n=1.如果n==1,只需要简单的将唯一一个盘子从A移动到B。当n>1时,我们可以将原问题分为3个子问题,如下:
1.将上面n-1个盘子从A移动到C,B作为辅助
2.将最下面的n号盘子从A移动到B
3.将n-1个盘子从C移动到B
这个图是当n=3的递归调用,用来帮助理解