相信不少人都听说过著名的“鸡兔同笼”问题,对无忧无虑的小学生来说,心理阴影不至于,但绝对是个巨大的挑战。问题是这样的:在一个笼子里,有鸡和兔子两种动物,两种动物脑袋共35个,脚一共94只,那么鸡和兔子分别各多少只呢?
当然啦,题目中的鸡和兔子都是正常的,没有残疾,也没有三头六臂。基于此,老老实实的考虑怎么才能算出答案呢?
《孙子算经》的解法
事实上,这个问题最早出现于《孙子算经》,并给出了一个解法:
- 所有动物的脚数除以2,得47;每只鸡有一对脚,兔子有两对脚。
- 假设笼子里全部是鸡的话,脑袋35个,脚也应该是35对,而事实上有47对脚。
- 如果把一只鸡换成一只兔子的话,47-35=12,说明需要12只鸡被替换为兔子,于是得到兔子的数目。
- 鸡的数目自然就是35-12=23只了。
对于上面的解法,理解起来也并不那么轻松,尤其对于小学生来说。我估计很多人在看完这个答案的时候,心里暗暗的佩服:这个解法真“孙子”!
有趣的算法
如果说一声令下,让每只鸡都金鸡独立,每只兔子也双脚站立卖萌。此时着地的脚一共是47只,而脑袋是35个;其中一只鸡头对应一个脑袋,一个兔头对应两只脚;那么脚的数量减去头的数量就是兔子的个数啦,兔子数目知道了,鸡的数量自然也就知道了;因此兔子12只,鸡23只。
有人质疑一声令下,说假如能让鸡单脚着地的话,为什么不直接让鸡报数?好啦,做人要厚道,这个问题就留给我们敬爱的、伟大的生物学家吧!事情不能做绝,也得给别人一碗饭吃。
然而,无论是《孙子算经》的算法,还是能和小动物沟通,都是结合了这个具体的背景,给出了具体的解法。假如说笼子里放几只蜈蚣的话,还像上面的算法那么算的话,估计谁算谁骂街。数学的使命,就是抛开具体事物,只研究其数量关系,找到通用的、一般的算法。
机械地尝试
如果我把题目改一下:在一个笼子里,关着鸡和兔子,两种动物的的脑袋一共是2个,脚一共是6个,问鸡和兔子分别有几只?
我相信很多人一瞬间,就得到答案了。那么如果改成一共3个头,8只脚呢?应该也会有比较多的小学生能得到答案。而这个思维过程其实很简单:尝试!如果笼子里小动物的数量少,试一两次就得到答案啦;如果数量大了,懒惰的我们就忽略了这种算法。
仍然考虑原问题中的笼子,通过尝试的方法,毫无疑问是要尝试更多次的:
- 假如是1只鸡,34只兔子,那么脚一共是1×2 34×4=138>94,不对;
- 假如是2只鸡,33只兔子,那么脚一共是2×2 33×4=136>94,不对;
- 假如是3只鸡,32只兔子,那么脚一共是3×2 32×4=134>94,不对;
- ……
这样一直试到23只鸡,12只兔子,问题得到解决啦;当然,如果从假设1只兔子开始,尝试的次数要少的多。如果说,在上面尝试的过程中,敏锐法察觉到脚的数量是在递减,你可能就会去跳跃的尝试,比如尝试完5只鸡,直接尝试10只鸡……,如此会更快的获得答案。
有些人会不屑,这种算法也叫算法么,我都没抖抖机灵。没错儿,这种算法比上面的两种算法更具一般性,无论笼子里关的是什么小动物都可以这样计算;当然了,这种方法很机械,而且随着笼子里动物数量增多,计算量也在迅速增大。
如果原问题中的笼子有67个,把这67个笼子中的鸡和兔子都放到一个大笼子里,就得到:鸡和兔子的脑袋一共2345个,脚6298只,那么鸡和兔子分别有多少只呢?
此时“尝试”的算法依然奏效,但是计算量就明显增加。面对机械的计算,有没有什么好办法呢?有!善良实在的计算机就登场了,它可以毫无怨言的按照“尝试”的算法,快速计算出鸡和兔子的数量。当然这个机械式的“尝试”算法可以做改进,这是另外一个话题。
方程
问题到此还远没结束呢。再如果把笼子换成农场,农场里除了鸡和兔子,还有鸭子、大鹅、肥猪、羔羊……,同样考虑求每种牲畜的数量问题,即便是动物总数量不算大,问题显然是更复杂了。那么,有没有更一般的方法,能解决这类问题。这就是方程或方程组的意义啦!
对于鸡兔同笼问题,转化为二元一次方程组,问题转化为求解方程组的问题,而不需要再考虑笼子里是鸡还是狗。
有了方程的解法,我们自然不会再采用上面那些具体的、烧脑的算法,包括机械的尝试算法。即使是计算机,也不该放着更高效的算法不用呀!当然计算量很大、机械的原始算法,可能不适合真正用于实际,但其逻辑的合理性,用于逻辑论证是毫无问题的!