汉诺塔的代码很好读懂,只有简单的递归规则而没有具体算法,
汉诺塔移动的操作其实只有三步:第一步,留下要移动的柱子中最大那个圆盘,其余上方所有圆盘堆移动到其他柱子上,第二步,把最大的底部圆盘那个放到b上,第三步,再把刚才移动到另一个柱子上的圆盘堆移动到b上
而实际上三根柱子我们可以看作组成了一个三角形,当我们需要将堆从a移动到c,就需要借助b作为交换的辅助,同理然后我们需要将堆从c移动到b,我们就需要a作为辅助,因此我们设定函数hanoi(n,m1,m2,m3)指的是将n个圆盘组成的堆从柱子m1借助柱子m3移动到柱子m2
想想看,我们是不是全程都是这样做的?无论是我们开始移动的圆盘堆,还是最终结果,圆盘的堆叠始终是自底向上从大到小放在一堆的,如果要进行下一次移动,我们会留下最大的那个圆盘,然后把上方的圆盘的顺序堆从一个柱子借助另一根辅助柱子,将其按顺序原封不动地移动到目标柱子,最后在最终移动的目标柱子上放上最后的那个大圆盘。
hanoi(n-1,a,c,b),n是我们最后要放的最底部的圆盘,把我们需要处理n-1个圆盘组成的圆盘堆从a借助b移动到c
move(a,b)把最大的底部圆盘放到b上
hanoi(n-1,c,b,a)把刚才移动到c的n-1圆盘堆借助a辅助移动到b上
这样我们就按照之前说的三步法实现了圆盘的移动,至于hanoi具体如何移动的代码例题并没有给出
而从这三个例子中我们也要学会递归的真正思维——最重要的不是怎么实现递归,而是怎么找到规则,递归是对函数的嵌套,函数则是我们的规则,而递归函数相当于f(x)以自身作为复合函数 f(f(x)),因此也不要忘记设置退出的条件。这是一个逻辑问题,如果我们找到递归的规则,实现它倒只是小事一桩了。