大家别被标题吓着了,今天我讲的完全是小学生能理解的内容范围内,虽然该内容的确可以应用到计算逻辑和算法里的。
我们来做一个游戏,让小朋友们选一个1到1000的整数,然后说我猜10次就能猜到你们在这么多个数里选出的一个数,只要你们用”是“或”否“回答我的问题,信不信?为方便演示过程,先把他们选的数说一下:159。
问题1: “你们选的数大于500?” — “否” 1-500
问题2: “你们选的数大于250?” — “否” 1-250
阿妹插嘴道:“我知道了,爸爸在缩小范围。”
问题3: “你们选的数大于125?” — “是” 126-249
问题4: “你们选的数大于188?” — “否” 126-188
问题5: “你们选的数大于157?” — “是” 158-188
问题6: “你们选的数大于173?” — “否” 158-173
问题7: “你们选的数大于165?” — “否” (158,159,160,161,162,163,164,165)
问题8: “你们选的数大于161?” — “否” (158,159,160,161)
问题9: “你们选的数大于159?” — “否” (158,159)
问题10: “你们选的数大于158?” — “是” 159
那么我猜到了,你们的数是159!
我说,这个方法就像阿妹说的那样,我们每猜一次,就把范围缩小一半。如果我们想象这些整数在一条数轴上,数字可能的范围缩小的过程就像这样:500,250,125,64,32,16,8,5,2,1。在这个过程中,我张开手臂,说这是数字的范围,每猜一次,范围减小一半,拿手比划缩小一半,有时候是右手动,有时候是左手动,让他们理解是范围或区间在减小。
那么我们猜三次,能够猜到什么范围的数呢?他们想了一下,说是8,因为猜一次范围变成4,第二次范围变成2,第三次范围变成1,就能确定了。
好!那我们再来做一个游戏。我们刚才说了,猜3次可以猜出区间为8的任何数,这此你们选一个1到27之间的整数。我来问三个问题,然后我一定就能猜出你们选的数,信不信?条件是你们的回答可以是三种:“是(yes)”,“否(no)”,“不一定(maybe)”
两个小孩喜欢挑战,说好的。他们选了12(没有预先告诉我的)。
下面是我的三个问题和缩小范围的演示:
问题1:“如果我在9到18里选一个数,我的数将会大于或等于你们选的数吗?”—“不一定”
“是”推出范围1-9;“不一定”推出范围10-18;“否”推出范围19-27
问题2:“如果我在12到15里选一个数,我的数将会大于或等于你们选的数吗?”—“是”
“是”推出范围10-12;“不一定”推出范围13-15;“否”推出范围16-18
问题3:“如果我在10和11里选一个数,我的数将会大于或等于你们选的数吗?”—“否”
“是”推出10;“不一定”推出11;“否”推出12
所以我说:你们选的数一定是12。
同样是缩小范围的算法,第一个游戏里用两种状态“是”或“否”来回答问题,第二个游戏里用三种状态“是”,“否”,“不一定”来回答问题,第二个游戏收缩的速度就快得多。如果我们用第二种方法,猜10次我们可以确定1到59000(大约),而不是1-1000(大约)里面的任何数。我们现在计算机的大脑最小单位叫做逻辑门,它们只会回答“是”和“否”两种答案。
网上查到从27里猜数的游戏的提问法有更容易操作的,其效果一样,都是3分法。但是其隐藏了问题的实质,我就不贴了。
注:刚才和孩子们的妈妈讨论了一下,认为第二个游戏里引入了类似于量子计算里的叠加态。输入“取一个区间的某个数”是一个叠加态,而输出“不一定”也是一个叠加态,只是我们忽略了回答叠加态里“是”和“否”的权重,把回答简化成了三态。
