zoukankan      html  css  js  c++  java
  • 汉诺塔-递归

    有三根柱子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);//移动到目标
    }

  • 相关阅读:
    WPF,WinForm调用WCF RIA
    使用c#调用XMLHTTP(XMLHTTPClass) ,发送和返回 json
    WPF 不能dll添加引用的问题
    ORACLE 10g下载|ORACLE 10g下载地址|ORACLE 10g官网下载地址
    写给我们这些浮躁的程序员
    oracle 10g 几个版本jdbc驱动下载
    List对象排序通用方法
    SQL 常用的计算时间的方法
    JAVA帮助文档全系列 JDK1.5 JDK1.6 JDK1.7 官方中英完整版下载
    Integer 自动装箱机制
  • 原文地址:https://www.cnblogs.com/lxzbky/p/10544502.html
Copyright © 2011-2022 走看看