2.9第九回 海伦先生对牛弹琴,阿兰小哥照猫画虎

上一节说到孔子后人孔融以让梨而闻名天下,下面,我们重回到古希腊,再重新见识一下前面提到的一位古代数学家海伦,和他有名的三角形公式,但海伦的三角公式,千百年来却逃不出阿基米德“牛”论的笼罩。 本回要说的是,敢于提出质疑,敢于想到问题的多面。完整的思考,证明编程的水平成长了。当然,如果对这个问题理解有难度,请再回顾第六回,它是本回的基础。

2.9.1 P9海伦的三角形

enter image description here

图2.9.1:海伦先生反复强调:海伦公式的原作者是他本人

海伦(Heron of Alexandria)是古希腊数学家,力学家,机械学家,约公元62年活跃于亚历山大,在那里教过数学、物理学等课程。他多才多艺,善于博采众长。在论证中大胆使用某些经验性的近似公式,注重数学的实际应用。海伦的主要贡献是《度量论》一书。该书共3卷,分别论述平面图形的面积,立体图形的体积和将图形分成比例的问题。其中卷I第8题给出著名的海伦公式的证明,设三角形边长分别是a、b、c,s是半周长(即s=(a+b+c)/2),则有Δ= 是三角形的面积。海伦用文字叙述了这一公式的证明,并举例加以说明。 在数学史上有许多未解的公案,海伦三角就是其中一桩,其实还有种说法,说海伦公式是阿基米德发现的,但这个名称已成为习惯用法,海伦公式又译希伦公式、海龙公式,传说是古代的叙拉古国王希伦二世发现的公式。但根据 Morris Kline 在1908年出版的著作考证,这条公式其实是阿基米德所发现,以托希伦二世的名发表。 除了海伦公式,他的成就还有:正3到正12边形面积计算法;长方体体积公式;求立方根的近似公式等。那究竟这个公式应该属于谁呢? 面对阿基米德数百年打压,海伦先生揭竿而起,海伦先生有话说:“这个成果的确是我的!我证明时留有一手,如果不是三角形,是不能用的!阿基米德不知道的。” 我们的问题是:在海伦先生的新理论下,如何求一个三角形的面积和周长呢?

2.9.2 五步积木法解题:

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

enter image description here

图1
enter image description here
图2

第二步:做头尾 上面的三部分,先分析开头和结尾部分,开头是什么呢?题中的已知条件,三条边a,b,c来表示。目标是什么呢?有两种可能,要么求出面积s和周长l,要么由于三条边不满足三角形的条件,而不能输出。这个输出比较难做,怎么办呢?暂一放,但应该弄清楚是两种可能出一种。

enter image description here

图3
enter image description here

图4A

enter image description here 图4B

第三步:连头尾

如何将开头和结尾连接起来呢?也就是建立“输入a,b,c”和“输出面积s和周长l,或因不符合三角形条件而不需输出”的关系,其特点是两种情况最终只有一种情况出现,所以用一个分支,就解决问题了!问题分成三部分,如图3中间所示。是否符合三角形的条件,符合情况下输出面积周长,不符三角形条件则输出“不能构成三角形”。

我们如何去应对这三部分呢(如图4A)?

首先看条件,这是前所未有的复杂的条件,只有任意两边的和大于第三边,才可能是三角形,是三角形才可能求面积,如何做这种保证呢?因为只有三条边a,b,c所以,上面的话翻译出来是:a+b>c且a+c>b且b+c>a。

然后看分支的左边,也就是条件成立时的活儿,这时,无非就是求三角形的面积,而早在第四节阿基米德的三角(如图4B所示)中,我们早就将该部分做好了!值得一提的是,两者又不完全一致。 最后看分支的右边,也就是不符合三角形的条件,这里要做的就更简单了,只要输出一种提示信息就行了。

第四步:贴语法

下面我们还用QBASIC语言来解这个题目。第三步图中的各个语句和具体语言的语法还有一定的差距,根据相应语言,还要再行将相应语句转化。一个是分支的条件,翻译成电脑语言,只要将“且”用and,一种表示并且的关系符号表示就行了;还有输出部分,两个输出都要转化成相应语句;公式的电脑语言化也要完成,保证在一行上,保证相关函数和括号用的准确。(如图5示)。

enter image description here 图5

第五步:写代码

下面可以很简单地写代码了,最重要的是后面的一部分。整个图可分成两大部分,后面的一个分支做为一大部分,这部分复杂一点,上面的一部分原封不动照搬,下面按分支语句的结构做出来,程序也就有了:

所以代码如下:
input a,b,c
‘第一个分支
if a+b>c and a+c>b and b+c>a then
l=a+b+c
k=l/2
s=sqr(k*(k-a)(k-b)(k-c))
print s,l

else
print “BuNeng GouCheng Sanjiaoxing”
endif

(上程序在Qbasic下调试通过)

enter image description here
图2.9.2 Scratch积木代码

2.9.3 阿兰开讲

程序演义到现在,最有意义和有意思的地方在于,阿基米德不会拐弯!前面的老问题继续出现在我们的新问题中。眼界开阔了,时代变化了,可能一个老的问题,会焕发出不同的生命力。
在我们将本题同阿基米德的三角比较的时候,不难发现,阿基米德的影子还是这个问题的本质。
阿兰要告诉大家的是:在编程方面,海伦先生的研究很有意义,除了思路不同的创新,照猫画虎的方法,是一永远有效的方法,抓住变化和不变,程序可能就做出了大半。
后面我们还将奉献上这样一些有意思的题目,进一步来看一下分支结构的特点,但遇到问题时,千万要拐一下弯,毕竟,我们现在有了两种控制问题的有力工具:分支和以前的顺序。欲知后事如何,且听下节分解。

2.9.4 小测验:分金条

如果让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费?

小测验参考答案:

我们可以给自己提个问题:人民币为什么不是从1元到100元都有相应的纸币呢?没有,可并没有妨碍我们每天花钱,但花的时候往往不是恰好是我拿的那些钱,但这并不妨碍我们,因为可以找零啊。有了人民币的经验,我们就可以分了,两次弄断就应分成三份,可以把金条分成1/7、2/7和4/7三份,应用用找零的原理,题目就不难解决了。这样,第1天我就可以给他1/7;第2天我给他2/7,让他找回我1/7;第3天我就再给他1/7,加上原先的2/7就是3/7;第4天我给他那块4/7,让他找回那两块1/7和2/7的金条;第5天,再给他1/7;第6天和第2天一样;第7天给他找回的那个1/7。