1. 程式人生 > >一堂有趣的計算機課

一堂有趣的計算機課

昨天討論了一些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粒葡萄。

小朋友:...啊嗚,啊嗚....

老師:小朋友們,你們吃到了可口的葡萄,也學習了電腦科學中的一道有趣的題目。
電腦科學,就是研究如何制定規則,和設計操作,從而解決問題的科學。
今天的課就到這裡。同學們,下課。