众所周知,猜1~100的某个数,对方只回答高了或低了和正确的情况下,使用二分法最快七次猜出。直观上想是因为100除以2(采用向上补足的方式,如25/2=13)正好除7次得1,可以遍历所有的数字。更本质地说,是二进制的体现。
二进制体现在哪呢?对方每次回答高了或低了就是1和0,回答七次,就是七个变量,就是七位二进制数,每一个二进制数表示一个十进制数,即可以表示0~127(把0当做128,就是1~128)一共128个数字。而我们只需要确定100个数字,这说明有些数字不需要七次判定,即那些中途就被猜中的数字。
接下来我们换一个读心术的游戏,不知大家是否见过魔术师哪一些写满数字的卡片依次问你心中所想的数字在上面有没有出现,你依次回答,最后魔术师就能神奇地读出你的内心。
同样是1~100,我们可以想见也是需要七组卡片。那么,每一张卡片上写几个数字,分别都写什么数字呢?这就是本文来探究的。
面对难题,我们可以先从简单点的类似问题出发,如1~16(正好取2的幂要方便些)我们该如何确定卡片呢?
首先,四张卡片即可这不用多说。接下来我们做探究。我们先假设每张卡片写四个数字尝试一下:
一:1 2 3 4(第一张卡片数字易知取什么都一样,故取1 2 3 4)
二:1 5 6 7(容易想到的是这里留个1,那么第一张说有,第二张也说有就能确定是1,后面补上新数字)
三:2 5 8 9(这里的2同第一张配合,5同第二张配合)
四:3 6 8 10(3同一,6同二,8同三,补一个10)
我们这组按照“后面的卡片帮助前面的卡片判断”的思路组合出的卡片可以发现能够顺利“读心”出10以内的数。那么为什么不能再多读出11~16呢?直观的感觉就是我们连这些数都没有位置写了,所以我们打算增多数字,一张卡片写5个数字再尝试尝试。(按照同样的思路)
一:1 2 3 4 5
二:1 2 6 7 8(我们发现只取1的话四组数并不能判断出5个数字,所以这里再加一个2)
三:3 4 9 10 11
四:1 3 7 9 10
我们可以发现这回虽然提到的数字多了,但连1~10都难以判断了,是怎么回事呢?每组卡片写的数字越多,因为我们只有四张卡片,按照此套思路,下一张卡片要包含上一张卡片的数字就要越多。比如第二张取第一张两个数字,那么就还要第三张再取第一张一个数字,会造成数字浪费。看似每张增多了数字,能够写出11~16了,实际则不一定。那么该怎么办呢?
我们不妨换个思路,我们回到第一次尝试再思考思考为什么理论上四组卡片可以确定16个数字而我们却只能确定1~10。假设我们想的是1,那么我们第一张说有,第二张也说有就能确定是1,这意味着后面就不需要判断了,写着二进制表示就是 1 1 × × (×意味着不论取1取0都对结果无影响)。这意味着那么浪费了几种对应情况,都将其对上1了。同理2就是1 0 1 ×,也存在浪费。那么我们想,如果我们写的卡片必须要四张一起合作才能判断那不就能符合理论的一对一了吗,我们来尝试“故意”让自己不好判断。这次写六个数字一组增加判断难度。
一:1 2 3 4 5 6
二:1 2 3 7 8 9
三:1 7 10 11 12 13
四:2 4 8 10 11 14
这回是每个数都要四张卡片一起配合了,但却判断不出几个数字了╥﹏╥...。可见我们故意让判断变得困难是行不通的。我们再换个想法,依然紧抓一对一的理论原则但是换一个实现方法——上文我们提到一个二进制数对应一个十进制数,那我们为什么不主动赋予每个数字二进制表示呢?即我们就让某个数字哪些卡片有哪些没有,比如我们就规定1就是0 0 0 1(无 无 无 有),2就是0 0 1 0(无 无 有 无)。那么我们就能列出一个表格。
1代表有,0代表没有
那么我们按此表格确定卡片数字
一:8 9 10 11 12 13 14 15
二:4 5 6 7 12 13 14 15
三:2 3 6 7 10 11 14 15
四:1 3 5 7 9 11 13 15
这样一来我们直接同时解决了两个问题:每张卡片需要8个数字,数字如上。为什么是8个,观察表格,我们可以发现就是 ()2(4−1) ,即一张卡片取“1”时,其他卡片可以组合出8个不同组合。至于数字组合,其实是可以变的,比如我规定1是 1 0 1 0(有 无 有 无)2是 1 1 1 0(有 有 无 无)又有什么不行?只需要满足一对一就都能成立。
我们再观察观察卡片的特征,比如我们取8,第一张说有,第二张说没有(此时排除12 13 14 15四个数字),第三张也说没有(排除7 10两个数字),第四张说没有(排除9一个数字)。排除的数字呈4 2 1排列,取其他数字也一样。这就是二进制的神奇之处,都是有关2的幂。
那么1~16我们解决了,1~100自然也不在话下了,快去制作你的读心术卡片吧O(∩_∩)O~~