c++学习笔记之汉诺塔问题


怀着一颗菜鸟的心小心翼翼的写着我的第一个博客,也是仅仅记录下我学习的过程,正如我的个人说明那样,一天进步一点点,还望多多指正。

本来想一下子浏览完《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 "<>n;

    cout<<"The moves are:"<

一开始总是纠结在那个参数的问题上,老是想为啥调用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

《c++学习笔记之汉诺塔问题》

这个图是当n=3的递归调用,用来帮助理解

    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/chenhaokun1993/article/details/26397439
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞