模拟盘子移动过程,以三个盘子为例
第一次:最小盘到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
来源:CSDN
作者:qq_39980334
链接:https://blog.csdn.net/qq_39980334/article/details/104276562