“7只鴿子飛回3個鴿巢中,不管怎么樣放,總有一個鴿巢里至少有三只鴿子”這反應了數學組合中的一個基本原理,稱為鴿巢原理(或者是抽屜原理),由德國數學家狄利克雷提出。鴿巢問題常見題型就是將3個蘋果放入兩個抽屜里面,無論怎么放置,肯定有一個抽屜里有兩個或者兩個以上的蘋果。今天我們就用Scratch來解決這個數學問題。
首先確定鴿巢和鴿子的數量,在輸入正確的數量之后,舞臺上顯示對應數量的鴿巢和鴿子圖片。系統會自動根據鴿巢原理形成一個將每個鴿子關進不同鴿巢的動畫效果。并給出最終的答案,且顯示解題思路(圖1)。

新建三個變量:鴿巢數量、鴿子數量以及答案。創建人物角色德溫對鴿巢問題進行解說,德溫會詢問一共有幾個鴿巢和多少只鴿子。界面中會根據輸入的數量顯示出鴿巢和鴿子。根據用戶給出的數量說出要解決的問題:多少個鴿巢飛進了多少只鴿子,那么一個鴿巢中至少飛進了幾只鴿子呢?使用鴿子的總數÷鴿巢個數=商……余數。答案=商+1。答案的最后附加上解題思路(圖2)。

當用戶在輸入框中輸入正確的鴿巢數量之后,會廣播“顯示鴿巢”并等待。鴿巢角色收到這條廣播后,會顯示并根據輸入數量減一克隆自身,這樣舞臺上算上本體數量就與要求一致了。在克隆時X軸增加60,等待0.5秒。表現出復制鴿巢的動畫效果(圖3)。

鴿子受廣播控制表現兩段動畫,出現和進入鴿巢。收到“顯示鴿子”時用鴿巢同樣的克隆方法顯示出來(圖4)。

當收到“動畫演示”后,將所有的鴿子全部隱藏,移動到第一個鴿巢位置中顯示,每個鴿巢先進入一只鴿子,第一排位置占滿后從第二排繼續進入,第二次重復執行語句的次數為鴿子數-鴿巢數-1。直至所有的鴿子全部收入鴿巢中結束(圖5)。

如何求出每個鴿巢中可以裝入多少只鴿子呢?只需要按照鴿子的數量除以鴿巢的數量的商進行向上取整。如果僅僅用簡單的數學知識來完成鴿巢問題其實是比較簡單的,當使用Scratch動畫模擬推導過程,就需要多方考慮變量和循環的變化以及角色圖形的限制,保證動畫效果的完美。