“鸡兔同笼”算法源流

时间:2022-10-18 06:07:02

“鸡兔同笼”算法源流

在“鸡兔同笼”问题的教学中,教师通常会将我国古代《孙子算经》的简单介绍附加到教学过程中,意图在于体现数学的历史发展,向学生渗透数学历史中的文化因素。这种想法固然好,但这种“附加”式的介绍对于实现这样的目的很难有实质性的作用。为了变“附加”为“融入”,让数学史中的知识与文化更好地发挥育人功能,教师就需要对数学史的相关内容做较为广泛、深入的了解。

“鸡兔同笼”问题在我国古代可以说源远流长,从问题的叙述到问题的算法都经历了不同形式的变化,了解这些内容对于课程内容的编制和教学设计会有所裨益。

一、 《孙子算经》中的“雉兔同笼”

“鸡兔同笼”问题始见于公元3~4世纪的《孙子算经》,该书作者不详。从清代的《子部集成?科学技术?数理化学?孙子算经?孙子算经(宋刻本)?卷下》中看,“鸡兔同笼”问题的叙述为:“今有雉兔同笼,上有三十五头,下有九十四足。问雉兔各几何。”[1](见图1)

其中的“雉”是“野鸡”的意思,“几何”是“多少”的意思。用现在的语言可以把这个问题叙述为:“鸡和兔在同一个笼子中,总头数为35,总足数为94。问鸡和兔各有多少只?”《孙子算经》中对这个问题的解法分为如下的四个步骤:

第一步:上置三十五头,下置九十四足

我国古代是用算筹进行计算的,所谓“算筹”就是用于计算的小棒,是古人用于计算的一种工具。这里所说的“上置三十五头,下置九十四足”,就是把题目中的头数“35”和足数“94”用小棒分别摆在上面的位置(上位)和下面的位置(下位)。(见图2)

古人用算筹表示数时,摆放方式分纵式和横式两种。通常用纵向小棒摆放个位数字,横向小棒摆放十位数字,以后依次纵横交替摆放。比如“35”就摆放成如图3形式。

如果横向摆放的数大于5,就用纵向小棒代表5,比如图2中的“”就表示5+4=9。

第二步:半其足得四十七

意思是求出下位总足数94的一半等于47。图2就变成了图4的形式。

图4中“”上面的横向小棒表示“5”,下面两条纵向小棒表示“2”,因此“”表示5+2=7。

第三步:上三除下三,上五除下五

这里的“除”是“除去”或“减少”的意思,“上三除下三”就是“从下位四十七中除去与上位相同的三十”,“上五除下五”就是“从下位四十七中除去与上位相同的五”。(见图5)

用现在的语言说,就是从47中减去35为12,得到兔子的只数。这一过程在《孙子算经》的“术”中叫做“以少减多再命之”(见图1),意思是以少减多之后,下位“总足数”的含义发生了改变,需要重新命名,也就是把“总足数”重新命名为“兔头数”。(见图5)

第四步:下有一除上一,下有二除上二即得

与前面类似,这句话的意思是用总只数35减去兔只数12就得到鸡的只数了。上位的“总头数”需要重新命名为“鸡头数”。(见图6)

以上算法的合理性并不难理解。总足数94取半成为47,此时相当于所有鸡都成为了金鸡独立的“独足鸡”,所有兔都站立起来成为了“双足兔”。此时每只鸡的头数和足数都是1,每只兔的头数是1,足数是2,所以用47减去总头数35就得到兔的只数是12。最后用总头数35减去12就得到鸡的只数。《孙子算经》中把这一算法概括为:“上置头,下置足,半其足,以头除足,以足除头即得。”不妨称此方法为“半足法”,右上的表格可以更加清晰地呈现这一过程。

二、 《算法统宗》中的“鸡兔同笼”

“鸡兔同笼”问题后来又收录于明代程大位(1533年~1606年)所著《算法统宗》第八卷的“少广章”。[2](见图7)

其中对问题的叙述把“雉”改为了“鸡”,因此“鸡兔同笼”的说法沿用至今。《算法统宗》中对问题给出了两种算法,这两种算法与《孙子算经》中的算法是不一样的,相当于现在所说的“假设法”。第一种算法的过程为:

第一步:“置总头倍之得七十”,意思是将总头数35加倍,也就是乘2,得到70。

第二步:“与总足内减七十余二四”,也就是从总足数94中减去70得到24。

第三步:“折半得一十二是兔”,将24折半(也就是24除以2),得到12,这就是兔的只数。

第四步:“以四足乘之得四十八足”,用每只兔的足数4乘12,得到兔的总足数48。

第五步:“总足减之余四十六足为鸡足”,用总足数94减去兔的总足数48得到46,就是鸡的总足数。

第六步:“折半得二十三”,将鸡的总足数46折半(46除以2),就得到鸡的只数为23。

另外一个算法是先求鸡的只数,与前面先求兔只数的程序基本相同,这一算法可以用下面表格的形式呈现出来。

《算法统宗》中关于“鸡兔同笼”问题的两个算法,在书中概括为两句话:“倍头减足折半是兔”和“四头减足折半是鸡”(见图7)。第一句话的意思是把求兔只数的过程分为了倍头、减足和折半三个步骤,“倍头”就是把总头数35加倍变成70;“减足”是用总头数94减去70得到24;“减半”就是取24的一半得到兔子的只数为12。这个过程写成如今的算式就是:

(94-35×2)÷2=12(只)

第二句话的意思是把求鸡只数的过程分为了四头、减足和折半三个步骤,“四头”就是用4乘总头数35得到140;“减足”是用140减去总足数94得到46;与求兔只数的过程类似,“折半”就是取46的一半得到鸡的只数23。写成算式就是:

(35×4-94)÷2=23(只)

这样的过程显然与《孙子算经》中的“半足法”不同,半足法首先将总足数减半。这里的第一步是用每只鸡或兔的足数(2或4)去乘总头数,因此不妨把这个方法叫做“倍头法”。不难发现,“倍头法”背后的道理其实就是现在所说的“假设法”。

《算法统宗》中的鸡兔同笼问题出现于该书第八卷中,实际上在之前的第五卷中就已经出现了与“鸡兔同笼”问题数量关系类似的“米麦问题”:“今有米麦五百石,共价银四百零五两七钱,只云米每石价八钱六分,麦每石价七钱二分五厘。问米麦各若干。”[3](见图8)

上一篇:理解 完善 超越 下一篇:把握关键,让“练习课”更具价值