汉诺塔问题(C++)

模拟盘子移动过程,以三个盘子为例

第一次:最小盘到C

中间盘到到B

最小盘到B

最大盘到C

最小盘到A

中盘到c

小盘到c

实现这个算法可以简单分为三个步骤:

(1)     把n-1个盘子由A 移到 B;(C为过渡盘)

(2)     把第n个盘子由 A移到 C;

(3)     把n-1个盘子由B 移到 C;(A为过渡盘)

到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。

代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

void hannuota(int n,char src,char medium,char dest);
int _tmain(int argc, _TCHAR* argv[])
{
    int m;
    cout<<"请输入盘子数量:";
    cin>>m;
    cout<<"移动"<<m<<"个盘子:"<<endl;
    hannuota(m,'A','B','C');
    system("pause");
    return 0;
}

void move(char src,char dest)
{
    cout<<src<<"-->"<<dest<<endl;
}

void hannuota(int n,char src,char medium,char dest)
{
    if(n==1) //结束点
        move(src,dest);
    else
    {
        hannuota(n-1,src,dest,medium);// 把n-1个盘子由A 移到 B;(C为过渡盘)
        move(src,dest);//把最大盘从A到C
        hannuota(n-1,medium,src,dest);//把n-1个盘子由B 移到 C;(A为过渡盘)
    }
}

运行结果:

调试:

3个盘子

以n=2进入递归  hannuota(n-1,src,dest,medium);// 把n-1个盘子由A 移到 B;(C为过渡盘)

重新执行函数体,回到函数起始点,继续执行,n!=1跳入else

以n=1进入递归  hannuota(n-1,src,dest,medium);又回到函数起始位置开始执行

n==1执行 move(src,dest);//把最大盘从A到C

进入move函数,void不需要返回值,实际是可以返回值的

n==1,执行完move()到函数末尾,如果不是void会有返回值,回到递归开始的地方

n=2时进入递归,递归完成n返回为2

下一步move(src,dest);//把最大盘从A到C

然后再以n=1进入递归 hannuota(n-1,medium,src,dest);//把n-1个盘子由B 移到 C;(A为过渡盘)

执行完毕回到开始调用的地方,第一个n=2的递归全部完成

再退回n=3

发布了24 篇原创文章 · 获赞 7 · 访问量 3774

猜你喜欢

转载自blog.csdn.net/qq_39980334/article/details/104276562