深刻的理解递归汉诺塔(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)_第1张图片

值得注意的是:

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

当直接写这个函数:

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

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

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



你可能感兴趣的:(递归,汉诺塔)