确实,初学C的时候,汉诺塔的递归看起来确实是比较神奇的程序。
其中主要就在hanoi 这个递归函数,传的参数里面有一个n 代表是几层递归。
如果n=1 代表只有一个,move(one,three); 就是把第一个移到第三个就行了。否则
第一个柱子上有n个(n>1) 要移到第三个。需要把上面的n-1个移到第二个,最下面的一个移到第三个,再把第二个柱子上的n-1个移到第三个。 要这三个步骤。
其中,第一个,和第三个步骤,和本身其实是一样的。
就是把n-1个移到第二个,注意hanoi的参数
/* 定义hanoi函数,将n个盘从one座借助two座,移到three座 */
two 即第二个参数,这是表示用来借助的
就假设n=2 吧 hanoi(2,'A','B','C'); 变成了
hanoi(1,A,C,B); //这个代表A座上有一块,需要借助C座,移到B座
A--->C
hanoi(1,B,A,C); //这个代表B座上有一块,需要借助A座,移到C座
最后会输出
A-->B
A-->C
B-->C
假设n=3 hanoi(3,'A','B','C');
hanoi(2,A,C,B); //这个代表A座上有两块,需要借助C座,移到B座
A--->C
hanoi(2,B,A,C); //这个代表B座上有两块,需要借助A座,移到C座
A座上有两块,需要借助C座,移到B座 会输出
A-->C
A-->B
C-->B
B座上有两块,需要借助A座,移到C座 会输出
B-->A
B-->C
A-->C
看到这么多疑问我敢肯定一点,你并没有真正意识到什么叫递归程序?这个程序不是一个很简单的程序,如果搞不清递归的详细定义,即使你明白了这个程序,也是勉强,如果想彻底了解到递归,必须了解它的定义,思路清晰后再看这道题就很简单了,相信你自己也可以独自解析这个程序。我下面有一个图还是比较简单明了的介绍递归的,可以参考下。
如果只有一个盘,直接把它从one移到three位置;若有n个盘,就假设有n-1个可以知道怎么移,那么把上边n-1个盘从one移到two位置,再把最底第n个盘从one移到three位置,最后把其余n-1个从two移到three位置。问题就解决了。
对于n-1可以依靠n-2解决,以此类推,直到2个盘时可以依靠1个盘的解决方法,到1个盘时,已经给出了解决方法。这就是递归的思想,类似于数学的归纳法。
buhui
pp