汉诺塔-递归

Posted lxzbky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔-递归相关的知识,希望对你有一定的参考价值。

有三根柱子A,B,C

A柱子上穿着N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要将所有圆盘移至C柱子,遵循以下规则:
1. 每次只能移动一个圆盘;
2. 小的上面不能放大的。

拆解问题,N个盘子,把最下面的那个大的看做地面,看成不存在,问题变为N-1汉诺塔问题

把下面两层看做不存在,就是N-2....

 

方法就是:

先移动一个盘子(解决1汉诺塔问题)

在此基础上,解决2汉诺塔问题

....

....

解决N-1汉诺塔问题

最终解决N汉诺塔问题

 

当然,递归是倒过来的,虽然思维是倒过来的,但实际顺序还是正的

 

递归思想:
1. 将A柱子上的n-1个圆盘都移到B柱子上(n-1汉诺塔)
2. 将A柱子上的第n个圆盘移到C上
3. 将B上的n-1个圆盘移动到C上了(n-1汉诺塔)

 

以4为例

将A上前三个盘子移动到B(3汉诺塔)

将最后一个移动到C

将B上的3个盘子移动到C(3汉诺塔)

 

下面解决3汉诺塔,这里是A到B

将上面两个盘子移动到C(2汉诺塔)

将第三个移动到B

将C上的两个移动到B

 

2汉诺塔问题,这里是A到C

将上面第一个盘子移动到B

将第二个盘子移动到C

将B上的盘子移动到C

 

好,上c++代码

//从X1柱子移动num个盘子到X2柱子,X3是中转
//原本函数参数是char from,char to,char zhongzhuan,int num
//但这样写有时候还会被变量英文含义所误导,所以无所谓啦

void hanTower(char X1, char X2, char X3, int num)
{
    if (num == 0)
        return;
    hanTower(X1, X3, X2, num - 1);//中转移动N-1个盘子
    cout << "Move " << X1 << "->"<<X2<<endl;//移动剩下的那个盘子
    hanTower(X3, X2, X1, num - 1);//移动到目标
}

以上是关于汉诺塔-递归的主要内容,如果未能解决你的问题,请参考以下文章

汉诺塔内存分析(python)

题目1458:汉诺塔III(不一样的汉诺塔递归算法)

递归中两个经典的汉诺塔和青蛙跳台阶问题

汉诺塔的C语言代码怎么写啊

汉诺塔(Hanoi)图解递归算法

Python函数递归之汉诺塔