汉诺塔(hanoi)递归

问题:

有A,B,C三个柱子,A柱子上有n个圆盘(从上到下,圆盘大小逐渐变大),要把它移动到B柱子上。

条件:

  • 每次移动,都必须保证小圆盘放在大圆盘上面
  • 每次也只能移动一个圆盘
  1. 如果 n = 1 n=1 n=1的话,就可以直接把A柱上的一个圆盘移动到B柱上,就结束了
  2. 如果 n = 2 n=2 n=2的话,得先把上面一个移动到C柱上,然后再把A柱上剩下的一个移动到B柱上,最后再把C柱上的那一个移动到B柱上。
  3. 如果 n = 3 n=3 n=3的话,得先把上面 2 2 2个移动到C柱上,然后再把A柱上剩下的一个移动到B柱上,最后再把C柱上的那2个移动到B柱上。
  4. 如果 n = n n=n n=n的话,得先把上面 n − 1 n-1 n1个移动到C柱上,然后再把A柱上剩下的一个移动到B柱上,最后再把C柱上的那 n − 1 n-1 n1个移动到B柱上。

因为最底下一个圆盘比任何一个圆盘都要大,所以在移动它上面 n − 1 n-1 n1个圆盘时就可以不用在考虑最后一个圆盘了(当它不存在)。

写具体实现的时候函数参数要有

  • 要移动的圆盘个数 n n n
  • n n n个圆盘现在在哪个柱子上
  • 想要移动到哪个柱子上
  • 哪个柱子可以用来作为桥梁
#include<iostream>
void hanoi(int n, char A,char B,char C)//n,圆盘个数,A当前圆盘所在位置,B要移动到的位置,C空位置
{
    if (n==1){
        std::cout << A << "--->" << B << std::endl;
        return;
    }
    hanoi(n - 1, A, C, B);//要想把n个圆盘移动到B柱,得先把上面n-1个圆盘移动到C柱上,为最底下一个圆盘腾出位置
    hanoi(1, A, B, C);    //然后把最底下的一个移动到B柱上
    hanoi(n - 1, C, B, A);//最后再把刚才移动到C柱子的n-1个圆盘B柱上
    return;    
}
int main()
{
    hanoi(3,'A','B','C');
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值