对Hanoi塔问题的理解

汉诺塔的递归算法如下(递归的原理和汉诺为什么可以用递归就不详说了):

 

void hanoi(int n,int A,int B,int C) { if(n>0){ hanoi(n-1,A,C,B); move(n,A,B); hanoi(n-1,C,B,A); } }

可以看出它跟树的中序遍历没有多大区别,在搜索的过程中,只是按照中序遍历的方式把节点输出出来。这样,我们就可以把中序遍历树画出来:

 

 

对Hanoi塔问题的理解_第1张图片

 

怎么理解这棵树呢?其中根节点就是要移动的最底下最大的盘,下一层节点是次大的盘……叶节点是最小的盘。每次遍历到某一个层的某一个节点,则移动该层所代表的盘。移动的方式的讨论必须先定义一个方向:

定义1ABCA这个方向为顺时针方向;

定义2ACBA这个方向为逆时针方向;

定义3、根节点为第一层,叶节点为最高的一层。

这样,当移动奇数层的时候,对应的盘顺时针移动一个塔座;当移动偶数层的时候,对应的盘逆时针移动一个塔座。

你可能感兴趣的:(算法)