C++课程讲到递归算法时,偶遇汉诺塔问题。由于之前在做一些小作品编程时看别人的代码案例发现看不懂,觉得编程关键还是思路问题啦啦啦~解决思路是第一个瓶颈,于是在这里还是小白的我希望能把我的思维过程展现出来以便以后要思考汉诺塔问题的小小白~
首先,我们必须自学递归的基础,递归通俗的来说就是自己调用自己,比如以下形式
void f(int n)
{
f(n-1);
}
但是一个有穷的递归必须加上一个终止条件,即递归到了源头
如
void f(int n)
{
if (n == 1)
{
cout << "到头了。。" << endl;
}
f(n-1);
}
下面是我对汉诺塔问题的一些思考过程
我首先是把简单的情况列举了以下,比如一个、两个、三个、四个、五个盘的情况,试图抽象出一个统一的规律(为此在实现递归的形式之前我先写出函数调用函数,递归的实质也是函数的调用嘛)
接着发现虽然字母不同,但是实质上三个盘的关系无非是起点、过渡、目标的关系,于是把字母统一。同时,除了n==1只有一步外,其他都有三步,高层函数的实现调用底层的函数,从中发现规律。
第四关:抽象出一个递归形式模型,难点就是触及最底层(即递归到源头的时候怎么内嵌进去整个递归函数)当然这也并不难,试验一下就能实现
下面便是解决if n==2的嵌入问题以及把伪代码写成代码雏形
然后就是眼除bug和测试运行了。
最后是程序和结果
这是小白认真思考这个问题后的一些心得体会~如果有错误还希望有大神指出~~~~~~~~~~~~~万分感谢~