汉诺塔是递归中的一道经典题目,接着我们看如何求解以及求解的思路。
首先了解汉诺塔
汉诺塔是给定三根柱子,通过一次移动一片圆盘将一根柱上所有圆盘移到另外一根柱上
而当圆盘数>=2时我们就要借助另外一根柱子当作中间量来转移圆盘,因此一般汉诺塔问题都是三根柱子。
我们在只有一个圆盘时直接一步到位,两个圆盘时需三步,三个圆盘时需七步..........
1. 如上图我们推理出n个圆盘时需要2^n-1步,接下来推理思路,在三个圆盘时我们可以先把A柱的最大圆盘忽略,然后用两个圆盘时的步骤将最大圆盘上的两个圆盘借助C柱移到B柱,然后再把最大圆盘移到C柱,再重复两个圆盘时的步骤,将B柱的两个盘借助A柱再次移到C柱。
2. 而两个圆盘移动操作时借助一个圆盘时的步骤,就是直接A->C所以我们可以由这个思路推理出,递归算法的条件就是(n==1).在n个圆盘时先移走n-1个,再重复步骤。
3. 我们可以证明重复步骤,如四个圆盘时就是15步,分解为三个圆盘时七个步骤移到B柱,再第八步最大圆盘移到C柱,再三个圆盘七个步骤将B柱上的三个圆盘移到C柱,总共7+1+7=15步。
4. 所以我们采用分解思想,保留最底部圆盘,移动n-1个圆盘,如下图:
思路有了后就可以开始实现代码了
以上就是代码的实现过程
总结:汉诺塔问题并不是难在代码,而是大事化小的思路实现,以及推理出递归的结束条件。这几点难以想到,而想到之后再实现代码就并不是特别难了。