2.10第十回 扁鹊医术回天有力,程哥之道正本固源

上一节说古希腊的海伦,带我们重新领略了一下他强有力的公式,下面,我们再回到古中国,见识一下一位古代的名人,神医扁鹊,据说,他有起死回生之术,活得非常精彩。

本回要说的是,问题之间有种奇妙的包含关系,大的问题其实包含着前面的小问题,温故知新的意义在这里体现得很好。

2.10.1 P10扁鹊的医术

enter image description here

图2.10.1 神医扁鹊的纵论医术

扁鹊,其真实姓名是秦越人,约生于公元前四O七年,逝于公元前三一O年。他为什么被称为“扁鹊”呢?这是他的绰号。据说他医术高明,善辨人的生死,能看到人的五脏六腑,有着起死回生的手段。于是,人们也尊敬地把他称为扁鹊。
有一次,他去会见齐桓侯,言谈之间,他听着齐桓侯的声音,看着齐桓侯的五官气色,便向齐桓侯说: “君侯,你现在有病了,要赶快医治一下。”齐桓侯不信,以为自己好端端的,一点感觉也没有,怎么说有病呢?便不去搭理他。过了五天,扁鹊又去劝说,齐桓侯仍然不信。后来,他又接连去劝说了几次,齐桓侯还是不听。扁鹊不得已才离开了齐国,扁鹊走后不久,齐桓侯的病就显现了,再派人去请扁鹊时,扁鹊已经远走了,过了不久,齐桓侯就死去了。
又有一次,他从虢国经过,听说虢国的太子死了,他问了一些情况以后,便去求见虢君,要为虢国太子治病,在他的诊断医治下,太子竟然复活了,不多日子就恢复了健康。这样一来,扁鹊更是医名远扬,找他看病的人越来越多,他都不辞辛苦,认真地给以诊治。究竟有多少病人,在他的医治下,重新获得了生命,数也数不清!人们把他看得和救命的神仙一样,都称他为神医。
其实扁鹊家有弟兄三人,但属他最有名气。在魏国行医的时候,魏文王问名医扁鹊说:“你们家兄弟三人,都精于医术,到底哪一位最好呢?”
扁鹊答道:“长兄最好,中兄次之,我最差。”
文王再问:“那么为什么你最出名呢?”
扁鹊答道:“我长兄治病,是治病于病情发作之前。由于一般人不知道他事先能铲除病因,所以他的名气无法传出去,只有我们家的人才知道。我中兄治病,是治病于病情初起之时。一般人以为他只能治轻微的小病,所以他的名气只及于本乡里。而我扁鹊治病,是治病于病情严重之时。一般人都看到我在经脉上穿针管来放血、在皮肉上敷药等大手术,所以大家以为我的医术高明,名气因此响遍全国。”
我们的问题是:扁鹊三兄弟中,谁的体重最沉呢?

2.10.2 五步积木法解题:

第一步:三积木
这是最简陋一个图形(如图1),也是最基本的一步。

enter image description here

图1

enter image description here
图2

第二步:做头尾

上面的三部分,先分析开头和结尾部分,开头是什么呢?题中的已知条件,是三个人体重数目,我们用a,b,c来表示。目标是什么呢?是最大值,我们将目标定为a。输出是a,但这个a是不是和输入时的a一样呢?显然是不一样的,前面的a有三种可能,可以最大,可以最小,还可居中,但目标中的a,一定是最大的了。

enter image description here

图3
enter image description here

图4

第三步:连头尾

如何将开头和结尾连接起来呢?也就是建立“输入a,b,c”和“输出最大值a”的关系,其特点是多种情况最终只有一种情况出现,所以再用一个分支解决,就不可能完成了!因为一个分支只能解决两种。怎么办呢?可以想想实际的情况,要使a中放最大的值,必须同后面两个值都比较完成,证明其最大,才是真正的最大值,将这个过程分析一下,可以分成两步,第一步,将a,b比较,使a>b;第二步,将a和c比较,使a>c,通过此两步比较完成,a的值一定就最大了,如图3中间所示。问题分成了两步,下面只要将此两步完成,题目最终也就解决掉了。

第一步和第二步是类似的,只要将a,b换成a,c就有了。先看第一步,比较a,b比较,使a>b ,这个题目似曾相识,也是很温馨的一个问题,正是孔融让梨中的两个数大小排序的问题,两种情况将来会出现一种,用一个分支就可以解决掉,该问题可分成了三部分(如图4示),再进一步,哥伦布的水杯问题也出现在题中了。第二步和第一步极其相似,稍稍一变换就有了。

第四步:贴语法

下面我们还用QBASIC语言来解这个题目。第三步图中的各个语句和具体语言的语法还有一定的差距,根据相应语言,还要再行将相应语句转化(如图5示)。
enter image description here

图5

第五步:写代码

下面可以很简单地写代码了,最重要的是中间的两部分。整个图可分成四大部分,中间的两个分支做为两个大部分,这部分复杂一点,上面的一部分原封不动照搬,下面一部分原封不动照抄,中间按分支的结构做好,程序也就有了:
所以代码如下:
input a,b,c
‘第一个分支
if a>b then

else
d=a
a=b
b=d
endif
‘第二个分支
if a>c then

else
d=a
a=c
c=d
endif
print a
(上程序在Qbasic下调试通过)

enter image description here

图2.10.2 Sctatch积木代码

2.10.3 阿兰开讲

程序演义到现在,开始出现更多的有意思的地方了:思路继续发生着转变,前面的老问题继续连番出现在我们的新问题中。同样,医生看到的精彩和病人体会的精彩也不同,程序员的精彩,可能也是这样,别人觉得不热闹的地方,在他们看来,可能有着独特的精彩。
在我们将本题同两个数求最大值的司马光石头比较一下,或同两个数排序的孔融的梨子比较一下,会有许多精彩的东西出现。一个最简单,两个稍复杂,三个和更多个呢?有意思的问题开始出现。
阿兰告诉大家的是:在编程方面,扁鹊先生告诉我们更重要的不是望闻问切,而是手段之后的真相。切不可头痛医头,脚痛医脚,有时表象是需要更深挖掘的。看准自己努力的目标,不要局限于已有的方法,大胆猜测,大胆动手,最终问题会得到解决。
后面我们还将奉献上这样一些有意思的题目,进一步来看一下分支结构的特点,以迎接更复杂的分支问题的挑战。欲知后事如何,且听下节分解。

2.10.4 小测验:黑夜过桥

现在小明一家过一座桥,过桥时候是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问小明一家如何过桥?

小测验参考答案 :

这类题目,其实是考察在限制条件下解决问题的能力。具体到这道题目来说,很多人往往认为应该由小明持灯来来去去,这样最节省时间,但最后却怎么也凑不出解决方案。但是换个思路,我们根据具体情况来决定谁持灯来去,只要稍稍做些变动即可:第一步,小明与弟弟过桥,小明回来,耗时4秒;第二步,小明与爸爸过河,弟弟回来,耗时9秒;第三步,妈妈与爷爷过河,小明回来,耗时13秒;最后,小明与弟弟过河,耗时4秒,总共耗时30秒,多么惊险。