您的位置:首页 > 理论基础 > 数据结构算法

tower of hanoi(汉诺塔)问题 按步骤分析--取自《严蔚敏·数据结构》 P55

2015-01-22 15:02 417 查看
在学习数据结构的时候,看到经典汉诺塔问题,产生了一些疑惑,就是在 递归调用的过程中,程序每步调用是怎么进行的。书中给出了3阶例程,但是不够详细,于是在弄明白之后,把自己得一点思路写在这里,一起分享。(本菜鸟第一篇博客,语言不到位之处还请批评指正,谢谢!

程序如下:

   void hanoi( int n,char x, char y, char z) //将塔座x由小到大编号为1到n的n个圆盘

1  {        //按规则搬动到z上,y可用作辅助塔座

2   if(n==1)

3   move(x,1,z);

4   else {

5   hanoi(n-1,x,z,y);

6   move(x,n,z);

7   hanoi(n-1,y,x,z);

8   }

9   }

 

void move(char x,int n,char z) //将编号为n的圆盘从塔座x移动到塔座z

{

printf("%i.Move disk % i from %c to %c\n",++c,n,x,z);//变量i为移动步骤计数

}

分析:

程序由递归调用完成算法,步骤如图所示:





我开始在对比图示看算法的时候,有一个地方一直搞不清楚,就是在首次进入第三层递归的时候,圆盘1号从塔座a移动到塔座c的时候,即程序完成第三层递归,回到第二层,这时运行第6行 move(x,n,z);也就是:a-->c(2号盘),跟图示完全不同,后来终于弄明白了。

就是在程序进入递归,重新调用本身的时候,x,y,z的赋值不是相对应的[/u],进入第二层递归的时候,b和c塔座是交换位置的,进入第三层递归的时候再次交换位置,从而又变成常规顺序,从左到右依次是a,b,c。

整个程序运行过程abc塔座的相应位置应该是:

abc-->acb-->abc-->cab-->bac-->bca-->abc(即图中递归工作栈状态,栈顶的顺序)

这样理解就明白了,递归通过本身的调用来逐次降低问题的量级,从而解决问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息