递归值汉诺塔

算法思想:

        汉诺塔有三个塔座,假设为A,B,C。

       移动布步骤:

       第一步:如果只有一个盘子的话,可以直接A塔座上移动到B塔座上;

       第二步:如果有n个盘子的话,先把n-1个盘子借助C塔座移动到B塔坐上;

                      把第n个盘子从A塔坐上移动到C塔坐上;

                      把n-1个盘子从Y塔座借助C塔座移动A塔座上;

                    重复上述条件,直到n==1时,结束算法

图解;

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

解:(1)n == 1

       第1次  1号盘  A---->C       sum = 1 次

       (2)  n == 2

       第1次  1号盘  A---->B

       第2次  2号盘  A---->C

       第3次  1号盘  B---->C        sum = 3 次

  (3)n == 3

  第1次  1号盘  A---->C

  第2次  2号盘  A---->B

  第3次  1号盘  C---->B

  第4次  3号盘  A---->C

  第5次  1号盘  B---->A

  第6次  2号盘  B---->C

  第7次  1号盘  A---->C        sum = 7 次

 

不难发现规律:1个圆盘的次数 2的1次方减1

       2个圆盘的次数 2的2次方减1

                   3个圆盘的次数 2的3次方减1

                       。  。   。    。   。 

                   n个圆盘的次数 2的n次方减1

 故:移动次数为:2^n - 1

实现代码如下:

    #include<iostream>    
    using namespace std;    
        
    void move(int n,char x,char y,char z)    
    {    
        if (1==n)    // 如果只有一个盘子的话,直接把盘子从A塔上移动到C塔上    
        {    
            cout << x<<"--->"<<z<< endl;    
        }    
        else    
        {    
            move(n-1,x,z,y);    // 把剩下的n-1个盘子,从A盘借助C塔移动到B塔上    
            cout << x << "--->" << z << endl;     // 将第n个盘子从A塔移动到C塔上    
            move(n-1,y,x,z);    // 将n-1个盘子借助A从B塔移动到C上    
        }    
    }    
        
    int main(void)    
    {    
        int n=0;    
        cout << "请输入要移动的盘子个数:";    
        cin >> n;    
        move(n,'A','B','C');    
        return 0;    
    }    


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值