c++汉诺塔递归(移动盘子)
题目是:有三个柱子A,B,C。A柱子上有N个盘子,大的在下,小的在上。 要求:把这N个盘子从A柱子移到C柱子,在移动过程中借助B柱子,每次只允许移动一个盘子,且在移动过程中都保持大盘在下,小盘在上。
其实原理很简单,无非就是把第N个(最大的)盘子保留在A柱,把N-1个盘子先拿到B柱子,再把第N个拿到C柱子,最后把中间(B柱子)的N-1个盘子拿到C柱子。
然而看到代码的我一脸懵逼,看来学了c++半个月的小白要开始经受算法的毒打了???但还是要硬着头皮解释啊(嘤嘤怪咆哮)。
。。。。。three hours later。。。。。。。
吃了块雪糕我们开始,需要定义两个函数:
1.move:虽然叫他move,但作用只是用来输出每一步移动的步骤。
2.hamoni:这边具体解释第16行和18行,假设共有三个盘子,n=3时,马上16行开始调用自身,n=2,此时以目标dest为过渡,把src柱的盘子拿到medium柱,代码里就是中间柱子和目标柱子一直交换来交换去直至n==1,move输出A–>C后,16行自我调用完毕,退回到n=2;
执行17行,move输出A–>B;
接着执行18行,此时n=2,以源src作为过渡,把medium柱上的盘子放到目标dest柱子,转到if,move输出C–>B,18行自我调用完毕,退回到n=2,此时else循环结束;
然鹅,整个程序没有结束,else结束以后,先是第一个递归倒退一下返回n=2,结束,然后是第二个递归倒退一下返回n=2,结束。划重点:一开始主函数main中调用的hanoi也需要一个返回值!!也就是疯狂倒退回最初的n=3,接着按照流程执行完的程序才算是真正结束!
// An highlighted block
#include<iostream>
#include<cmath>
using namespace std;
void move(char src, char dest)
{
cout<<src<<"-->"<<dest<<'\n';
}
void hanoi(int n, char src, char medium, char dest) //src:源柱子;medium:过渡柱子;dest:目标柱子;
{
if(n==1) //如果只有一个盘子,就直接从A拿到C;
move(src, dest); //src直接放进dest, src 是起始柱-A柱, dest 是目标柱-C柱
else
{
hanoi(n-1, src, dest, medium); //16行;
move(src, dest);
hanoi(n-1, medium, src, dest); //18行;
}
}
int main()
{
int m;
cin>>m; //自定义盘子个数;
hanoi(m,'A','B','C'); //调用函数,传实参;
return 0;
}