哥伦布水杯戏权贵,阿兰煮酒论编程

编程爱好者

编者按:最近,我们收到不少读者来信,他们对学习编程知识表现出强烈的欲望。但他们觉得传统的编程文章太枯燥、深奥,希望能有一种轻松有趣的学习方式。本期开始,我们将通过系列连载的方式向大家推出“阿兰程序演义”,相信博学多才的阿兰能陪着你轻松度过编程入门阶段。

电脑发展的历史,PC发展的历史,互联网发展的历史,甚至整个科技发展的历史,促使我们去发现更多的历史真相。阿兰,将以自己独特的方式告诉我们许多历史故事的编程版本。当然,阿兰看到的并不是惟一的,在已逝的和未逝的许多优秀人物中,都有类似的东西。阿兰的任务就是和我们一同挖掘这些故事背后的编程真相。

1492年10月12日,哥伦布(Christopher Columbus)发现了新大陆——美洲大陆,他是发现美洲的第一人;同样的,在电脑世界中也有许多第一,第一个程序是谁发明的呢?对于这个问题,现在无从考证。但经阿兰考证,程序和哥伦布有一定的关系,不信,请接着看。

在很懂电脑和不很懂电脑的许多人中,有人会问:“编程,编程,到底什么是‘程’呢?”说来说去,对于初学者,“程序”这一词才是最难破解的。程序意思非常简单,就是步骤。当我们能明白“程序”这两个字的意思的时候,距明白编程就不远了。而哥伦布将给我们上很好的一课。

哥伦布水杯问题

哥伦布何许人也?他正好逝世了五百年,他生活在1451到1506年,是西班牙的著名航海家,是地理大发现的先驱,尤其以发现美洲大陆而名垂青史。

哥伦布发现了新大陆后,在皇室为他举行的庆功宴中,有许多权贵对他不服,其中有一位大臣不服气地说:“任何人坐在船上航行,都能到达大西洋的对岸,有什么稀奇,值得大家这样大惊小怪!”有几个大臣也在一旁附和。

哥伦布听到后一言不发,朋友们都为他着急,埋怨他为什么不辩解呢?

过了一会儿,哥伦布叫仆人从厨房拿来两个同样大小的茶杯,它们盛有满满的两杯水,一个杯中是茶水,另一个杯中也是水,只不过是盐水,他提出的问题是,如何将两杯水交换?许多人尝试,包括当时西班牙最著名的杂技师也没能将这两杯水倒过来,都失败了。下面轮到哥伦布了,朋友们为哥伦布捏了一把汗。哥伦布怎么办呢?

这时只见哥伦布又拿来一个杯子,……

满桌的王公大臣哗然,都叫着这算什么游戏,三岁小孩也会做啊!

我们的问题是:大家为什么哗然,而哥伦布究竟是怎样交换的呢?

哥伦布水杯问题解析

直接交换显然是不行的,不可能将第一个杯的水直接倒在第二个杯中,那不是我们所希望的结果,但我们的思路却往往局限于这点。那么请思考,如果直接交换,除非我们会变戏法,像手里拿着三个帽子在头上和两手间轮换,但不可能滴水不漏地将第一个杯子中的水直接倒在第二个杯子中。

仅仅只有两个杯子在地球上是几乎不可能完成的,哥伦布的惊人之举就在于拿来了第三个杯子!利用第三只杯子,我们的工作就简单了,可以这么做(如下图示,用a、b、c表示三只杯子):

18-f15-2.jpg

1. 将b杯中的茶水倒入空杯c中,使b杯先空出来;

2.将a杯中的盐水倒入空出来的b杯中,现在a杯空出来了;

3.将c杯中的茶水倒入a杯中。交换完成。

上面事实上就是程序,我们在生活中解决问题的步骤,将这种步骤换上具体的电脑语言,那就成了电脑“程序”了。

上面是我们所遇到的最简单的一个可以作为程序的例子。1、2、3的次序是不可以交换的。这个例子用计算机语言怎样实现呢?要实现我们还要考虑其初始状况和结果输出。所以除了前面的一部分,在该部分的前面和后面还应有相应的步骤。

'准备工作,先将两只杯子中放入水,假设茶水是8,盐水是5

b=8

a=5

'真正开始交换

c=b

b=a

a=c

'将两杯水摆到台面上再看一下,是否交换正确

print a,b

(以上用QBASIC语言写成)

这就是程序,我们对电脑说的话,一定要符合事情发生的规律,也就是时间上的先后关系,要不然,电脑就不会做,或者给出我们一个和我们的期望完全不同的结果。

当然,聪明的您可能也发现了,用一个杯子来中转交换的方法,还有第二种,只要将上面123改成321,且将箭头方向一转就行了,再看一下图,组成了一个循环往复的圆,逆时针和顺时针转都可以实现我们最终的目标。再找第三种方法,就很难想象了。

当然,照此发挥,如果我们再找来两只杯子,也可以,但做法会稍稍有所不同。

这就是程序,用在电脑中,就是用在电脑中用电脑语言来描述的让电脑解决一个问题的步骤,用一个术语来说明这个步骤,又叫做算法。

阿兰开讲:

哥伦布可以发现新大陆,我们也可以发现电脑的新大陆;同样,电脑的路可以不止有一条。哥伦布的故事给我们的启示也许正是:干什么都要创造,编程也需要。编程需要步骤,创造步骤难,但是了解别人的创造步骤容易,并且了解别人的东西也是我们后面创造的基础。

18-f15-1.jpg

哥伦布发现美洲大陆的意义远不止上面一个故事所能承载,但上面故事传达的另一项重要的含义在于:交换或交流是非常重要的。交换是我们社会生活中不可缺少的普通的一部分,由于交换,使得我们各行各业中的人们得以彼此享受他人的服务,使得这个社会更加富足而美好。同样的,交换在电脑的世界中也非常重要,哥伦布的水杯问题虽然简单,但谁能说复杂的问题就不是由像它一样简单的东西构成的呢?哥伦布水杯问题的另一重要性在于它是后面我们许多问题的解题基础。

编程的问题其实就这么简单,哥伦布给了我们一个简单的答案,还有更简单的如同我们常听到的小故事,究竟简单到一个什么程度呢?欲知后事如何,且听下回分解。

小测验:酋长

有一个酋长被怀疑得了传染病(注意只是怀疑) ,要由三个医生轮流检查才能确定有没有感染,而那三个医生也有可能感染到,可是现在只剩两副双面都消过毒的手套,请问医生们该如何检查?