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

来源:互联网 发布:windows 平板 编辑:程序博客网 时间:2024/06/06 08:30

算法:

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的情况呢??

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



1 0
原创粉丝点击