话说自去年年底那次一道小学二年级算术题🧮引发的纷争🤣后,我又一次成功挑起了战火。这次是周孃发到群里的一道小学四年级算术题🧮:
有甲、乙、丙三个油桶🛢,各盛油若干千克。
先将甲桶里的油倒入乙、丙两桶,使乙、丙桶内的油各自翻番。
再将乙桶里的油倒入丙、甲两桶,使丙、甲桶内的油各自翻番。
最后,再将丙桶里的油倒入甲、乙两桶,使甲、乙桶内的油各自翻番。
此时,各桶内的油均是 16kg 。
问:甲、乙、丙桶内原来各有多少油?
有很多种解法,其中一种就是小学老师引以为豪的倒推法:
油量 | 甲桶 | 乙桶 | 丙桶 |
---|---|---|---|
最后的油量 | 16 | 16 | 16 |
油量 | 甲桶 | 乙桶 | 丙桶 |
---|---|---|---|
最后的油量 | 16 | 16 | 16 |
第三次倒油之前的油量 | 16 ÷ 2 | 16 ÷ 2 | 16 + 16 ÷ 2 + 16 ÷ 2 |
油量 | 甲桶 | 乙桶 | 丙桶 |
---|---|---|---|
最后的油量 | 16 | 16 | 16 |
第三次倒油之前的油量 | 8 | 8 | 32 |
第二次倒油之前的油量 | 8 ÷ 2 | 8 + 32 ÷ 2 + 8 ÷ 2 | 32 ÷ 2 |
油量 | 甲桶 | 乙桶 | 丙桶 |
---|---|---|---|
最后的油量 | 16 | 16 | 16 |
第三次倒油之前的油量 | 8 | 8 | 32 |
第二次倒油之前的油量 | 4 | 28 | 16 |
第一次倒油之前的油量 | 4 + 28 ÷ 2 + 16 ÷ 2 | 28 ÷ 2 | 16 ÷ 2 |
即:
油量 | 甲桶 | 乙桶 | 丙桶 |
---|---|---|---|
最后的油量 | 16 | 16 | 16 |
第三次倒油之前的油量 | 8 | 8 | 32 |
第二次倒油之前的油量 | 4 | 28 | 16 |
第一次倒油之前的油量 | 26 | 14 | 8 |
我不喜欢这种解法,首先是一如既往地「不直观」,难以第一时间想到。反正我第一时间想到的是列方程组:
油量 | 甲桶 | 乙桶 | 丙桶 |
---|---|---|---|
原始油量 | x | y | z |
第一次倒油 | x - y - z | y × 2 | z × 2 |
第二次倒油 | (x - y - z) × 2 | 2y - 2z - (x - y - z) | 2z × 2 |
第三次倒油 | (x - y - z) × 2 × 2 | (2y - 2z - (x - y - z)) × 2 | 2z × 2 - (x - y - z) × 2 - (2y - 2z - (x - y - z)) |
即:
x - y - z = 4
3y - x - z = 8
7z - x - y = 16
解之即得。
「设未知数,列方程」的做法当然更直观,但诟病在于所谓的「小学生没学过方程组」。代数的方法(即引入未知数)固然繁琐,但只要了解了这一方法,傻子都能解出来。而倒推的办法对没接触过的人来说,则难以想到。
倒不能说,「倒推」是只适用于这道题的特殊技巧。倒推是从结论出发,缩小搜索空间的一种有效且常规的手段。但在这,对于一个四年级的小朋友而言,理解题意已经绞尽脑汁了,还要反其道而行之,技巧性过强。这才是我反感的点——把数学教学当作技巧训练。
数学教学应该是什么样的?用项武义老爷子的话就是「化繁为简,以简御繁」。
倒推,你说技巧性太强;方程组,更是没学过。那这道题怎么教?
首先,「没学过」的借口太过蹩脚。我高中的时候就把微积分学了,更不举 Galois 21 岁发明群论的故事了。
我会把代数解法作为第一方案推给学生,如果他们不能理解,再告诉他们倒推的方法。目的在于告诉他们,哪怕不能理解,也存在直接的、显而易见的解法。也在于告诉他们,方法不止一种,方法至少有两种:正面出击 & 背面包抄。
我最害怕的是,小朋友心中种下一个念头:那道题有且仅有一个非常精妙的解法。首先,真实世界的解法并非只有唯一一种。其次,我宁愿小朋友用工程的办法找到答案 / 或者绕开问题,也不希望小朋友困在那个「正确的答案」里面。
而如果这两种方法都不能理解,做不出来又何妨?
何况,还有暴力破解的办法:(这里做了个偷懒的假设:油量为正整数)
def delta(x, y, z)
x1 = x - y - z
y1 = y * 2
z1 = z * 2
x2 = x1 * 2
y2 = y1 - x1 - z1
z2 = z1 * 2
x3 = x2 * 2
y3 = y2 * 2
z3 = z2 - x2 - y2
[x3, y3, z3]
end
N = 100
N.times do |i|
N.times do |j|
N.times do |k|
p [i, j, k] if delta(i, j, k) == [16, 16, 16]
end
end
end
我甚至想过:先随便猜一个答案,然后用最速下降法收敛到答案。