博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉诺塔问题的思考
阅读量:4180 次
发布时间:2019-05-26

本文共 1211 字,大约阅读时间需要 4 分钟。

汉诺塔问题是一个经典的递归问题,具体描述请点。

在已知汉诺塔问题是递归问题的基础上,我们套用递归三定律来解决它:

  1. 问题的最小规模。最小规模就是两层的汉诺塔。这很好解决。将盘1从柱1移到柱2,将盘2从柱1移到柱3,将盘1从柱2移到柱3,完成。
  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/

你可能感兴趣的文章
1136 . 欧拉函数
查看>>
面试题:强制类型转换
查看>>
Decorator模式
查看>>
Template模式
查看>>
Observer模式
查看>>
高性能服务器设计
查看>>
图文介绍openLDAP在windows上的安装配置
查看>>
Pentaho BI开源报表系统
查看>>
Pentaho 开发: 在eclipse中构建Pentaho BI Server工程
查看>>
android中SharedPreferences的简单例子
查看>>
android中使用TextView来显示某个网址的内容,使用<ScrollView>来生成下拉列表框
查看>>
andorid里关于wifi的分析
查看>>
Hibernate和IBatis对比
查看>>
Spring MVC 教程,快速入门,深入分析
查看>>
Android 的source (需安装 git repo)
查看>>
Ubuntu Navicat for MySQL安装以及破解方案
查看>>
java多线程中的join方法详解
查看>>
在C++中如何实现模板函数的外部调用
查看>>
HTML5学习之——HTML 5 应用程序缓存
查看>>
HTML5学习之——HTML 5 服务器发送事件
查看>>