一堂有趣的计算机课

昨天讨论了一些Computing at school的内容。受到Richard Bird在
Pearls of functional algorithm design一书中Saddleback search一章的启示,我这里抛砖引玉,给出一个我心目中的中学计算机课的例子。

教师:
同学们,早上好。想必你们都吃过了营养丰富的早餐。现在该补充一些维生素了。
同学们每人都会得到一串葡萄和几个盘子。今天我们要考虑一个有趣的问题:

    如何吃到最大的10粒葡萄。

明明:老师,我想出了一个办法。

教师:说说看

明明:
我先找出最大的一粒葡萄,然后吃到肚子里。然后,我在剩下的葡萄中找到最大的,吃掉。
重复这个过程。当我吃到第10粒葡萄时就可以了。

教师:
很好,但是有一个问题,明明同学需要向其他小朋友详细解释一下。你如何才能找到
最大的那粒葡萄来吃掉?

明明:...

小美:老师,我想到了如何找到最大葡萄的办法了。

教师:说说看

小美:
我先随便找两粒葡萄,比较它们的大小,然后把小的那粒放到盘子里。把较大的那粒拿在手里。然后,我继续从葡萄串上摘一粒葡萄,和手里的那粒比较。如果新的这粒大,我就把原来手里的那粒葡萄放到盘子里,否则,就把新的这粒放到盘子里。重复这个步骤,最后我手里剩下的就是最大的葡萄,把它吃掉就可以了。

教师:非常好!明明,小美,你们两个可以把自己的那串葡萄吃掉了。
同学们,你们还有别的办法能吃到最大的10粒葡萄么?

强强:老师,我想到了一个办法

教师:说说看

强强:
老师,我们上体育课的时候,不是从矮到高站成一列么?所以我觉得,如果我把葡萄也从小到大排成一列。然后把最后面的10粒葡萄吃掉就可以了。

教师:
这个办法是可行的,可是如何让葡萄像小朋友们一样,从小到大排成一列呢?这个问题很有趣,我们可以单独在其他课程里仔细学习这个问题。这个问题名叫“排序”,是计算机科学中非常重要,非常基本的一个问题。今天我们暂时先不讨论他。强强小朋友,你可以把自己的葡萄吃掉了。
不过请你按照自己想的方法试试看。

同学们,你们谁还能想到别的方法?

小朋友:...

教师:我给大家说一个方法。我们可以随便在这串葡萄中选择一个,把所有比这粒小的葡萄放到红色盘子里,把所有比这个葡萄大,连同这粒葡萄的放到蓝色盘子里。然后我们数数蓝色盘子中葡萄的个数,如果超过10个,我们只需要吃掉蓝色盘子中最大的10粒葡萄就可以了。否则,我们要吃掉所有蓝色盘子里的葡萄,比如x粒,然后再吃掉红色盘子中的最大的10-x粒葡萄就可以了。

小朋友:... 我们不大明白

教师:
同学们,我刚才讲的方法,使用了计算机科学中非常重要的递归思想。的确有些难。不过我们来亲自做个实验吧。乐乐,你来按照我说的方法给大家表演一下。

乐乐:嗯,我首先找到一粒葡萄,放在手里,然后我把剩下的每粒葡萄和这粒比较。小的放到红色盘子里,大的放到蓝色。好了,现在有14粒葡萄在蓝色盘子里。我怎么吃掉其中最大的10粒呢?

乐乐:
老师,我明白了。现在这个蓝色的盘子,就好比刚才那串大葡萄,所以我只要重复刚才的步骤。
我从蓝色盘子里选一个,把比它小的放到黄色盘子里。比它大的放到绿色盘子里。现在绿色盘子里只有6粒,我把它们全部吃掉。

乐乐:
现在我要吃掉黄色盘子里最大的4粒葡萄就可以了。老师,我完全明白了。

老师:
很好,小朋友们,你们现在已经学习了,计算机科学中的k选择问题。现在请大家像乐乐小朋友一样,按照这个步骤吃掉最大的10粒葡萄。

小朋友:...啊呜,啊呜吃葡萄....

老师:
小朋友们,现在作为练习,请大家吃掉剩下葡萄中最小的12粒葡萄。

小朋友:...啊呜,啊呜....

老师:小朋友们,你们吃到了可口的葡萄,也学习了计算机科学中的一道有趣的题目。
计算机科学,就是研究如何制定规则,和设计操作,从而解决问题的科学。
今天的课就到这里。同学们,下课。

猜你喜欢

转载自liuxinyu95.iteye.com/blog/1913288