上节讲到法国数学家韦达先生,用一个小小的数学公式,使西班牙军队阴沟里翻船。下面。我们将继续我们的程序之旅,穿越时空,回到远古的希腊去,去继续潘M的问题。

enter image description here
图:宙斯想着自己下达的“千日豆令”,不禁窃喜

2.13.1 P13宙斯千日豆令

在古希腊,据说宙斯是天界的最高统治者。潘多拉公主(第三节人物),诸神因妒忌她的美貌,便说服宙斯送给她一个神秘的盒子,她却播撒起希望豆。
据说在这个盒子中有一种希望豆,她将希望豆发放了三天,希望它能撒播人间。第一天,她把该希望豆中的一半又多一个发给生活在山上的人们;第二天,把剩下的一半又一个发给平原上的人们;第三天最后剩下的一半又一个豆豆发给海岛上生活的人们,到第四天一看,只剩下一个豆豆了,她将这个豆豆永远留在盒子里,也使人们希望永留人间。
潘多拉撒豆后不久,在人间的口碑越来越棒,这可激怒了农神,他向宙斯打小报告说,潘多拉靠撒希望豆抬升自己的声望。宙斯想了另外一个办法,你不是厉害吗?我叫你先撒上十年希望豆试一下,但必须天天发,十年就3650天,看你烦不烦!宙斯为自己的聪明主意而窃喜。问题也就出来了:农神要给潘多拉多少希望豆呢?

2.13.2 千日豆令和计数器分析
有两个问题需要解决,首先,是建立千日的计数器,使一千个日月能够准确无误地下去。另外,还需要研究这种千日模式,有没有一定规律,有没有联系,我们只要把握好它,就可以一劳永逸地继续下去。
建立规律
先研究第二个问题,连接第三节破解潘MM的盒子,她的神秘盒子中的希望豆,给我们的启示是:要建立当天和后一天的联系。也就是将第4天和第1天建立联系,即建立当前天和前一天的关系,他们的关系即“第三天数量/2-1”和第四天相等,因为是已知第四天s4求第三天s3,将关系反过来可用公式s3=2*(s4+1),其他的几个关系类似。

enter image description here
图1

再进一步,代码也就有了:
s4=1
s3=2*(s4+1)
s2=2*(s3+1)
s1=2*(s2+1)
print s1
问题到了这里,好象应该结束了。利用赋值的特点,如果将s后的数字去掉,让我们有柳暗花明又一村的感觉。代码得到了进一步简化:
s=1
s=2*(s+1)
s=2*(s+1)
s=2*(s+1)
print s
了解到这里,我们可以解千日豆令的问题了:农神需要预备多少希望豆呢?撒三天和撒一千天,从方法上差不多。如果将“年”最终要转化成“天”,十年就是3650天,要撒这么多天豆,和撒3天有什么不同吗?通过三天的潘多拉撒豆,我们不难看出,最后一天还是剩下一个,中间的天数从3天扩展到3650天了,那在3天中,中间出现了三条相同的语句s=2*(s+1),那依此类推,千日豆令解题的中间将会出现3650条语句!
s=1
s=2*(s+1)
s=2*(s+1)

s=2*(s+1)
(总计3650条)
print s

怎么解决呢?我们是不是还要将这种语句在程序中重复键入3650条呢?用计数器来默默帮助我们理顺上面的关系。
计数器
当然不用重复输入3650条语句,那样就太愚蠢了,电脑语言中有另外一种简洁的方式,它就是可重复的计数器(如图2)。
enter image description here

图2
计数器的三个特点:
 开始计数值
 结束计数值
 开始到结束的递增值

上例中,i从1开始,到3650结束,这还不能保证重复3650天,还有一个隐藏的条件,即从1到3650过程中,每次增加一个值。全写出来代码是:
For i=1 to 3650 step 1
通过这种计数器,可用用循环方式,将需要表达的意思简单化,就是我们变换向电脑描述问题的方式,不再一句一句地和它去对话,而是直接告诉它,请做3650遍吧!
根据图2,可以想象的代码形式如下:
s=1
for i=1 to 3650
s=2*(s+1)
next i
print s

问题到此处原该圆满结束了,但真刀真枪地到电脑上实验一下,上面的程序在执行的过程中会出大问题!为什么呢,因为真要撒3650天,您可以算一下,希望豆豆的数目将会大到连神仙都害怕,这个数会大到1后面有好几百个0那么大,用上面的方法,我们的微机是无法用这个程序完成的。
但我们的重点不在这里,我们的重点是想通过千日豆让大家体会一下什么是循环。所以,可以看一下20天的希望豆是一种什么情况?这是个有意思的对比,代码如下:
s=1
for i=1 to 20
s=2*(s+1)
next i
print s
上面的代码可以很好地在电脑上执行。美妙的重复规律可以用循环,需要我们注意的是,循环也不是无限制的,且不可超过电脑中限制的最大的放数字的空间,如果真超过了,思路还要发生转变。

2.13.3 阿兰开讲 :
宙斯的真意是想说:撒三天豆是一种放松,撒千天豆是种惩罚!
而面对这种惩罚,潘M魔盒中蕴藏着一颗更有力的“希望之豆”,它就是我们的赋值语句,即形如s=…s…之类的语句,通过它们,可以传达“形似神不同”的神奇功效。这颗希望豆传达了顺序程序结构和循环结构之间的关系。
这种特效,再加上一个理性的计数器,就可以将复杂的有规律的事情进行描述了。记数器与“形似神不似”的有机组合,形成了一种很具创新精神的语言结构形式。
如何将二者结合到一起,关键是根据实际情况,找出其规律性。找规律最好的办法是一个示例一个示例地分析。分析第1种情况,第2种,第3种,…第n种,…最后一种。
这其中,最值得我们注意的一点是,“3”这个数字是我们编程中尤其要重视的一个数字,当我们遇到比3的时候,就要思考是不是还要闷头做下去,遇到超过3的重复的时候,我们首先要想到的是:是否有什么规律。将这种规律同计数器有机结合整合到一起,程序就跑起来了,附合实际问题的解决方法就出来了。
循环是什么呢?
说白了它就是和下命令的口吻来让电脑干活,而不是自己费力地机械地去辛苦地劳做。
这可能也就是电脑和我们人类不同的地方吧,让电脑以它善长的方式去做,人们以自己善长的方式告循环结构:人和电脑各取所需
其实循环又象是完全没有必要的。因为只要有了顺序语句和分支,一切问题处理起来就绰绰有余了。象我家的电话是2222222,您可以怎么描述呢?我们会说7个2。事实上循环的工作和上面的电话号码有些类似。我们通过尽量少的工作,去表示一个其实仍很完整的事例或意思。象我们下达这样的命令:让一个人在家中用笔写出一亿个“人”字,我们没必要这样下达,请你写“人”、“人”、......“人”(说了一亿个人)。用好了循环,才能真正体会到人和机器的区别。循环和前两类语句的区别在于,循环可以很简单地描述前者重复性的问题。
有了循环,才真正体现出程序的意义所在。
循环问题本身,一种独立的可与循环问题相合的计数器,二者结合,会成就许多简洁有效有效思的编程故事。 后面,我们的重点问题如何深入研究循环。欲知后事如何,且听下节分解。

2.13.4 小测验:遗产分配
一位寡妇将同她的即将生产的孩子一起分享她丈夫遗留下来的 3500元遗产。如果生的是儿子,那么,按照罗马的法律,做母亲的 应分得儿子份额的一半;如果生的是女儿,做母亲的就应分得女儿份 额的两倍。可是发生的事情是,生了一对双胞胎——一男一女。
 小测验参考答案:
法律是不能违背的,最重要的是实行母亲是儿子一半,女儿是母亲一半,将财产先分成五份,女儿得一份,母亲两份,儿子四份,问题就迎刃而解,所以分别是500元,1000元和2000元。