汉诺塔问题-递归

来源:互联网 发布:电话黄页怎么关闭网络 编辑:程序博客网 时间:2024/06/06 00:26

问题描述:将A柱上的n个圆盘移动到C柱
代码

long cnt;//count,用来记录移动的次数,因为是全局变量,所以cnt已经被初始化为0void hanoi(int n,char a,char b,char c)//表示有n个圆盘要从a柱移动到c柱,b柱作为辅助柱{    if(n==1)//作为hanoi(n-1,a,c,b);(与hanoi(n-1,b,a,c);)的边界条件,**前几个**圆盘已经被移动到了c(a)柱上,现在只需要将a(b)柱上的**最后一个圆盘**移动到b(c)柱上    {        cnt++;        printf("第%d次,%c柱-->%c柱\n",cnt,a,c);//注意此a,c非彼a,c    }    else//不断通过递归来缩小问题规模(下面的注释是从整体上考虑的,不解释更深层的递归,因为每个递归结构执行的操作本质上都是一样的)    {        hanoi(n-1,a,c,b);//将这n-1个圆盘看做一个整体,从A柱移动到B柱,C柱作为辅助柱        {            cnt++;            printf("第%d次,%c柱-->%c柱\n",cnt,a,c);//将最后的盘子从A柱移动到C柱        }        hanoi(n-1,b,a,c);//再将这n-1个盘子从B柱移动到C柱,A柱作为辅助柱    }}int main(){    int n;    scanf("%d",&n);    hanoi(n,'A','B','C');    return 0;}

算法描述
①代码来自《程序员的数学思维修炼》一书,更详细的解释可以在这上面找到。
②请细细理解代码中加粗的内容,体会递归的思想。
③当要考虑更深层的递归时,将大写字母换成小写字母(如:printf(“第%d次,%c柱–>%c柱\n”,cnt,a,c);//将最后的盘子从A柱移动到C柱–printf(“第%d次,%c柱–>%c柱\n”,cnt,a,c);//将最后的盘子从a柱移动到c柱→),A,B,C是不变的,而a,b,c的值是变化的

原创粉丝点击