但是这个方法其实是错误的。正确的程序设计方法是自顶向下,先整体后局部;而不是自底向上。原因在于:底层函数是被上层函数调用的,调用方才清楚输入输出以及上下文环境。自顶向下才可以最大限度地防止方向性或战略性错误。方向或战略错了,战术再对也没用。
这个课程就是为了帮助大家深刻理解自顶向下程序设计方法的精髓,才提出了扑克牌翻牌问题。这个问题是这样的:
有一副只有点数没有花色的扑克牌,点数分别是1,2,3,...,20,一共20张。我们把所有牌正面朝下堆成一叠放在手上,然后用另一只手翻开第一张,发现是1点。我们把这张1点牌放在一边,然后再摸下一张牌。这时我们并不看它的点数,而是把它放在这叠牌的末尾,使之成为最后一张。接着,我们翻开下一张牌,发现是2点。我们把这张2点牌也放在一边,然后按顺序摸两张牌,不看点数,而是把它们放在这叠牌的末尾。注意:是把它们一起放在末尾还是把它们一张一张按顺序放在末尾的结果是一样的。再翻开下一张牌,发现是3。这张3点牌也被放在一边,我们再一张一张地摸3张牌,并按顺序放在末尾,...。以此类推,直到把所有牌都翻开并放在了一边。检查被翻开的牌的点数,发现按顺序分别是1、2、3、...、20。问:最初牌的顺序是什么?
如果你是第一次遇到这个问题,那么第一眼看,这个问题似乎有些难度。更难的是,要编写程序让计算机来解决它!幸运的是,我们有自动向下程序设计方法。采用这个方法,这个问题几乎没有什么难度。如果你不信,请看视频。