本文共 1211 字,大约阅读时间需要 4 分钟。
汉诺塔问题是一个经典的递归问题,具体描述请点。
在已知汉诺塔问题是递归问题的基础上,我们套用递归三定律来解决它:
- 问题的最小规模。最小规模就是两层的汉诺塔。这很好解决。将盘1从柱1移到柱2,将盘2从柱1移到柱3,将盘1从柱2移到柱3,完成。
- 大规模问题向小规模问题演化。三层汉诺塔可以将上面的两个盘子看做一层,这样就变成了两层汉诺塔;四层汉诺塔可以将上面的三个盘子看做一层,这样就变成了两层汉诺塔……
- 不断调用自身
通过这个思路,其实不难写出解决这个问题的Python程序
def moveTower(height, frompole, withpole, topole): if height >= 1: moveTower(height - 1, frompole, topole, withpole) moveDisk(height, frompole, withpole) moveTower(height - 1, withpole, frompole, topole)def moveDisk(disk, frompole, topole): print(f'把盘 [{disk}] 从 {frompole} 号柱移动到 {topole} 号柱')moveTower(4, '1', '2', '3')
输出为:
把盘 [1] 从 1 号柱移动到 3 号柱
把盘 [2] 从 1 号柱移动到 2 号柱 把盘 [1] 从 2 号柱移动到 1 号柱 把盘 [3] 从 1 号柱移动到 3 号柱 把盘 [1] 从 3 号柱移动到 2 号柱 把盘 [2] 从 3 号柱移动到 1 号柱 把盘 [1] 从 1 号柱移动到 3 号柱 把盘 [4] 从 1 号柱移动到 2 号柱 把盘 [1] 从 2 号柱移动到 1 号柱 把盘 [2] 从 2 号柱移动到 3 号柱 把盘 [1] 从 3 号柱移动到 2 号柱 把盘 [3] 从 2 号柱移动到 1 号柱 把盘 [1] 从 1 号柱移动到 3 号柱 把盘 [2] 从 1 号柱移动到 2 号柱 把盘 [1] 从 2 号柱移动到 1 号柱
然而我遇到的问题是:如果花上几分钟细品这个程序,我会感觉这个程序很难理解!这个函数调用自身两次,还有一个输出。我很难在头脑中模拟这个程序的流程,即使是拿纸笔去慢慢盘,也并不能直观的理解它。顿时觉得递归的思想离我是那么的遥远。
但是无意间我看到一个,他真正的道出了理解递归算法的精髓:
对递归的理解的要点主要在于放弃!
放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件。
我相信存在非常复杂的递归算法,这些算法也许对于人脑来说是一个“黑箱”(不是严格的黑箱,只是说难于理解程序的流程)。我们必须放弃对全局的理解,紧抓关键的两个点,完全信任递归的严谨性。
转载地址:http://rrqai.baihongyu.com/