汉罗塔问题的递归实现

#include
using namespace std;
void move(int m,char a,char b);
void hanoi(int m,char one,char two,char three);
int main(){ 
    hanoi(4,'A','B','C');
    return 0;
}
void move(int m,char a,char b){
    cout<"< }
//hanoi的函数说明,借助two这个柱子把盘子从one移动到three这根柱子上
void hanoi(int m,char one,char two,char three){
    if(m==1){
        move(m,one,three);//如果只有一个盘子,就直接从第1个位置移动到第3个
    }else{
        /*
            如果需要移动的盘子m大于1个,思路是先把前m-1个盘子移动到中间的位置,然后再把第m个盘子移动到第三根柱子上
            然后再借助第一根柱子把前m-1个盘子移动到第3根柱子上
        */
        hanoi(m-1,one,three,two);
        move(m,one,three);
        hanoi(m-1,two,one,three);
    }

}

汉罗塔问题的递归实现_第1张图片

其实递归的效率是非常低的,但是递归思路在解决某些问题的时候非常使用,主要体现在思路清晰,代码实现非常简单,困难是找到递归问题的结束点。

就拿汉罗塔问题来说,首先要移动第m个盘子,从A移动到C,必须先将前m-1个盘子从A移动到B,然后才能成功的把第m个盘子从A移动到C,第m个盘子成功的从A移动到C以后,剩下的有是一个m-1个盘子的汉罗塔问题,现在需求变成了需要把m-1个盘子从B借助A移动到C。

你可能感兴趣的:(算法)