课程分类

课程介绍
课程目录
用户评论
课程介绍
课程目录
用户评论

你将获得

  • 掌握某些知识点
  • 学会某些技巧(或思路)

教学服务

  • icon

    1v1专属答疑服务

  • icon

    BAT专家面试辅导

讲师介绍

  • 计算机软件博士,有32年软件开发和教学经验,《深度学习程序设计实战》作者。方老师擅长用通俗易懂的实例,结合代码,讲解复杂难懂的数学和计算机理论知识。他的课程常融会贯通计算机各学科领域,如博弈、编译、递归、多线程、贝叶斯网络等等。许多学生认为方博改变了他们对计算机科学和数学的看法,影响了他们一生。

  • 课程详情

    程序由模块或函数组成,函数与函数之间有调用关系。很多程序员习惯自底向上的程序设计思路。即先编写底层函数,再编写调用底层函数的函数,以此类推,逐渐向上层扩展,直到最后编写主函数(主模块或主程序)。这种做法即使在很多有经验的资深软件工程师中也存在。其根据在于底层的函数不调用其他函数,一般来说比较简单,所以出于先易后难的目的,大家就习惯于这种做法了。

    但是这个方法其实是错误的。正确的程序设计方法是自顶向下,先整体后局部;而不是自底向上。原因在于:底层函数是被上层函数调用的,调用方才清楚输入输出以及上下文环境。自顶向下才可以最大限度地防止方向性或战略性错误。方向或战略错了,战术再对也没用。

    这个课程就是为了帮助大家深刻理解自顶向下程序设计方法的精髓,才提出了扑克牌翻牌问题。这个问题是这样的:

    有一副只有点数没有花色的扑克牌,点数分别是1,2,3,...,20,一共20张。我们把所有牌正面朝下堆成一叠放在手上,然后用另一只手翻开第一张,发现是1点。我们把这张1点牌放在一边,然后再摸下一张牌。这时我们并不看它的点数,而是把它放在这叠牌的末尾,使之成为最后一张。接着,我们翻开下一张牌,发现是2点。我们把这张2点牌也放在一边,然后按顺序摸两张牌,不看点数,而是把它们放在这叠牌的末尾。注意:是把它们一起放在末尾还是把它们一张一张按顺序放在末尾的结果是一样的。再翻开下一张牌,发现是3。这张3点牌也被放在一边,我们再一张一张地摸3张牌,并按顺序放在末尾,...。以此类推,直到把所有牌都翻开并放在了一边。检查被翻开的牌的点数,发现按顺序分别是1、2、3、...、20。问:最初牌的顺序是什么?

    如果你是第一次遇到这个问题,那么第一眼看,这个问题似乎有些难度。更难的是,要编写程序让计算机来解决它!幸运的是,我们有自动向下程序设计方法。采用这个方法,这个问题几乎没有什么难度。如果你不信,请看视频。