深刻的理解递归汉诺塔(Hanoi)

算法:

1, 从目标出发,我们将n个盘子从A移动到B通过C,假如我们这样写

      hanoi(n, a, b, c);

2, 同理,我们也就可以知道,将n-1个盘子从A移动到B通过C,即就是:

      hanoi(n-1, a, b, c);

3, 但是我们知道我们一次只能移动一个盘子,所以,如果我们要将n个盘子从A移动到B通过C,我们可以将其分解为三步(对其进行递归,从难到易,知道移动完最后一个然后退出程序):

     1,我们先将n-1个盘子从A移动到C通过B: hanoi(n-1, a, c, b);

       2,然后我们就可以先将第n个盘子从A移动到B: move(n, a, b);

       3,最后我们再将n-1个盘子从C移动到B通过A: hanoi(n-1, c, b, a);



程序:

#include <stdio.h>                                                                                                                              

void move(int n , char a, char b)
{
        printf("第%d个盘子:从%c ---> %c\n",n, a, b);
}

void hanoi(int n,  char a, char b , char c){     //将n个盘子从a移动到b经过c

        if(n == 0)
                return ;
        hanoi(n-1, a , c , b);           //将n-1个盘子从a移动到c经过b
        move(n, a, b);                           //将第n个盘子从a移动到b;
        getchar();
        hanoi(n-1, c, b, a);                     //将n-1个盘子从c移动到b经过a
        }


int main()
{
        int n;
        printf("plz input 盘子数n:");
        scanf("%d", &n);
        while(n<=0){
                printf("抱歉,你输入的不合格!!!,请重新输入:\n");
                scanf("%d", &n);
        }
        hanoi(n, 'A', 'B', 'C');

        return 0;
}

运行结果:

值得注意的是:

我们写的程序应该能经得起一般的验证,

当直接写这个函数:

hanoi(3, 'A', 'B', 'C');
用户只能看到移动3个盘子的情况,不能验证其他情况,这样真的好吗??

当n是由用户自己输入的情况下,那么可能会出现一些非法的情况,如n的输入值为负或者0的情况呢??

所以,我们应该让我们的程序鲁棒行强一点,让我们一起养成好习惯吧!!!



  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值