劉渝霞 鄧秀華 山東省濰坊市濰城區濰州麓臺學校
中華文明,燦若星河、綿延閃耀,中華民族先輩經過大量理論研究和實踐探索,編寫了如《九章算術》《周髀算經》《算法統宗》《海島算經》等數學名著,為世界數學和人類文明的發展做出了巨大貢獻。著眼當下,《義務教育信息科技課程標準(2022年版)》(以下簡稱“信息科技新課標”)的頒布,進一步凸顯全面提升學生數字素養與技能,培養學生用算法思維分析解決生活中的問題的能力。本單元的設計將帶領學生穿梭時空,探尋歷代數學家及其偉大成就,感受古代算學故事中蘊藏的巧思與奧妙。
“身邊的算法是信息科技新課標第三學段(5~6年級)中的內容,包括算法的描述、算法的執行、算法的效率等。信息科技新課標在教學提示中提到:從學生的生活體驗或《九章算術》等典籍中的適當問題出發,將算法學習的要點貫穿問題求解的過程,讓學生在不同算法的具體討論中養成算法思維,避免空洞地講授抽象概念。5~6年級學生的認知發展正處于從具象思維到抽象思維的過渡時期,所以,筆者在編制《信息科技學生學習手冊》(以下簡稱“學習手冊”)時,對“身邊的算法”模塊,注重了具象內容和抽象內容的關系與平衡。
學習手冊中的“身邊的算法”設計流程如圖1所示。在選擇算法實現語言時,充分考慮到新課標弱化編程語言和具體的完整代碼實現,更加重視算法思想和用編程思維解決問題的設計原理。真正要實現算法,需要運用代碼進行描述,在中小學一般使用C++或Python語言來實現。在學習中,筆者選擇利用C++作為范例,是因為它擁有豐富的數據結構、運算符和表達式,解決問題時可以通過多種途徑,其語法限制不太嚴格,所以在設計時更加主動、靈活。當然,真正落實到教學中,教師可以根據自己的區域教育環境和教學要求來選擇不同的語言。

圖1
從5~6年級小學生的知識、思維水平、學習能力等因素出發,選定的古代算法問題包括雉兔同籠、盈不足術、物不知數、河上蕩杯、有女善織五大類問題。按由易到難的梯度設置,知識點螺旋式上升,逐步加深。
數學問題:雉兔同籠。通過閱讀《孫子算經》的算學題目讓學生用現有知識解題,引導學生化難為易尋找規律解決問題。
師:我國古代數學名著《孫子算經》中記載了這樣一道趣題——今有雉兔同籠,上有三十五頭,下有九十四足,問雉兔各幾何?同學們嘗試猜測一下雞兔各有幾只?
(1)算法體驗
①枚舉法(窮舉法):學生填寫表1找出答案。

表1 雉兔同籠算法1
②圖示法:使用符號替代頭和腳的方式,按提示步驟進行繪畫得出結果。(“○”表示頭,“|”表示一只腳)
第一步:先畫8只動物的頭。第二步:分腳,為每只動物畫兩只腳,共__________只腳。第三步:把剩下的__________只腳用完,要給其中的__________只動物各添2只腳變成兔子。
根據畫圖,我們可以看出:雞為______ 只,兔為_______ 只。
③假設法:根據題目中給出已知條件或結論作出某種假設,把復雜的問題簡單化。
a.假設全為雞,則共有腳_______。b.實際腳數與假設腳數之差_______(總腳差)。c.每只兔子比每只雞多______(單只腳差)。d.兔子只數=總腳差_______ ÷單只腳差____ 。e.雞的只數=_____ 。
學生再通過試一試,假設全為兔時的求解過程,鞏固本部分學習。
④抬腳法:古代數學中的“術”,即解題方法。通過給出原文,學生體會古代數術的有趣和思想。
術曰:上置頭,下置足;半其足,以頭除足,以足除頭,即得。
古人讓雞抬起一只腳,兔子抬起兩只腳,還剩____ 只腳,此時每只兔比每只雞腳數多_____ ,這時腳與頭之差______ 就是_____ 的只數。
(2)練習拓展
通過“練一練”的兩道題,加深學生對算法的認識和應用。
練習鞏固:在一個停車場,停了汽車和三輪車一共32輛,這些車一共有108個輪子。求汽車和三輪車各幾輛?
思維拓展:雞兔共有100只腳,若將雞的只數和兔的只數互換后,則共有腳86只。問原有雞和兔的數量各是多少只?
(3)編程驗證
在掌握了雉兔同籠的多種算法后,將枚舉法的原理應用到現代編程中,結合for循環結構來實現枚舉過程。
①用流程圖引導學生思考解決問題的過程,分析流程圖(如圖2)判定框中的條件。

圖2
②將流程轉換為代碼,并將分析的條件補充完整(如圖3)。

圖3
③提高難度,優化思想。如何把雙重循環簡化為單層循環,從而降低程序的時間復雜度。
假設雞的數量為i,則兔的數量為:35-i。寫出簡化結果。
(4)思維進階
給出一個同類進階問題——百僧百饃,進行實操演練。通過分組法的啟示,編寫程序輸出答案驗證分組法的結果正確與否。
“1個大和尚3個小和尚”為一組,每組需要饅頭____個;100個饅頭可供給____組;大和尚__人;小和尚_____ 人。
“盈不足術”是我國古代勞動人民首創的解題方法。通過對《九章算術》中“盈不足”“盈適足和不足適足”“兩盈和兩不足”三類盈虧問題的計算,感悟古人智慧,體會古代算法的高效有趣,理解算法對學習生活帶來的便利。其中,“盈適足和不足適足”問題,原文如下:今有共買豕(shǐ)。人出一百,盈一百;人出九十,適足。問人數、豕價各幾何?
(1)算法體驗
①將問題用圖例進行展示(如圖4),使學生對算法的理解更加形象。

圖4
②引導學生思考,豬的價格和人數都不變,為什么第一種情況總錢數會多出100元呢?
③通過分析推導,得出解決辦法:
第一種情況比第二種情況一共多出了____元,則每人多出了___ 元。因此,可以知道一共有____(列式)人,豬的價格是___ 元。
(2)編程驗證
①在“試一試”環節,運用解析法,找出問題的前提條件與結果之間關系的表達式,并通過cout輸出語句來實現問題求解的方法。
小科給同學們分文具,如果每人分9套,還多12套,如果每人分10套正好分完,小科班里有多少個同學?一共有多少套文具?
cout<<"小科班里有"<< 12/(10-9) <<"個同學。"<<endl;
cout<<"一共有"<< 12/(10-9)*10 <<"套文具。"
②在學生對三類盈虧問題探究完成后,給出了“練一練”環節,通過三個問題加深學生對盈不足術的理解和應用。
某校五、六年級要乘車去人工智能體驗中心參加實踐活動。如果每車坐65人,則有5人不能坐上車;如果每車多坐5人,正好多余了一輛車。請問一共有幾輛車?學生有多少人?
本題屬于哪類問題?
□盈不足 □兩盈 □兩不足□盈適足 □不足適足 (輸出結果)
“物不知數”問題出自《孫子算經》卷下第二十六題:“今有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。問物幾何?”本課通過明代數學家、珠算發明家程大位在其《算法統宗》中《浪淘沙》一詞,展開“物不知數”問題算法的推導與學習。內容如下:昨日獨看瓜,因事來家,牧童盜去眼暈花。信步廟東墻外過,聽得爭差。兩兩數(shǔ)余一,三三余二,四四數之余三瓜。借問至少盜幾瓜,已會先答。
(1)算法體驗
①篩選法:學生通過填寫滿足三個條件的數,觀察得到具有相同的數字,即得到答案。了解其思想與編程中的枚舉異曲同工。
②補湊法:通過體驗“補湊法”的推導,感受該算法形成的過程。從余數與除數的數值規律,通過加、減的形式將多個條件的余數變為相同數,即補湊法中的“缺同”“和同”和“余同”問題,從而使用一個最小公倍數將多個條件合而為一,使問題簡化,快速得到答案。探究的過程遵循“從生活到算法”“從簡單到復雜”的規律,符合學生的認知規律,有利于學生分層學習,盡量滿足不同學習能力學生的需求。
(2)編程驗證
①經典問題“韓信點兵”是“物不知數”問題的一個應用。在本項目中,通過《孫子歌訣》(如下頁圖5)的算法思路進行解題。

圖5
②用分治算法將“點兵”問題的條件進行逐一突破,編寫程序用枚舉的方式找到多個答案,在此過程中對算法不斷進行迭代和優化,找到最優解。
《孫子算經》中有一個有趣的問題——蕩杯問題,原題如下:今有婦人河上蕩桮,津吏問曰:“桮何以多?”婦人曰:“家有客。”津吏曰:“客幾何?”婦人曰:“二人共飯,三人共羹,四人共肉,凡用桮六十五,不知客幾何。”
(1)算法體驗
學生進行題意解讀,感受古代數學文字之美,提煉關鍵數學信息。(術曰:“置六十五只杯,以一十二乘之,得七百八十,以一十三除之,即得?!保┩ㄟ^對“術”中兩個關鍵數學信息“一十二”“一十三”的推演,將原題為多人合用一個碗,轉變思維,利用擴大12倍數(保證每人所用的碗為整數)的方法,改變為一人使用多個碗(13個碗),從而巧妙地解決問題。
(2)編程驗證
通過枚舉法,引導學生理解for循環語句的解題思路(如圖6),從如何確定人數范圍、如何提高效率減少循環次數、如何找到成立條件等問題上去樹立學生的編程意識和對循環語句的使用規則。進一步通過古“術”解謎讓學生感受古代數術的奧妙,發現公倍數對程序編碼的優化作用,用理論指導實踐,用實踐發展理論,不斷提升學生對算法思想的認識。

圖6 用以體現兩種歌唱情境狀態變化的折線圖

圖6
《九章算術》第三卷“衰(cuī)分”中記載了這樣一個有趣的問題:今有女子善織,日自倍,五日織五尺。問日織幾何?
(1)算法體驗
學生通過閱讀題目抓取關鍵信息,通過每天織布數量的變化規律就可以求出每天的織布份數是多少和每天織布份數占五天總份數的比,從而算出每天的織布數。通過填寫表2找思路并發現規律,引出數組的優點。

表2 織布份數m和總份數s信息列表
(2)編程驗證
本題從已知的結果“五日織五尺”出發,使用遞推法,用迭代表達式逐步逆推,并將“織布份數”和“織布數”兩個環節進行動態規劃,各自突破后再進行問題組合,就是“衰分術:有女善織”的完整的程序解決方案,讓學生既了解了衰分術,也對“問題分解是為了更好地解決問題”有了良好的認知。
在教學過程中,教師不能僅以解題為目的,需要給學生提供更多體驗的機會。通過古代數術啟發學生解決問題的思路,激發學生的認知內驅力。
對于本模塊,新課標提到,將算法學習的要點貫穿問題求解的過程。因此,教師應主動精鉆細磨教學內容,深入地掌握和理解,熟悉其應用,這樣才能正確引導學生理解算法和算法思想。
利用算法設計的邏輯性和嚴謹性,可以培養學生嚴密的邏輯思維,提高其分析問題和問題解決的能力;利用算法實現方式的不確定性,可以培養學生的探索精神和創新能力。因此,教師在教學的過程中要充分發掘各種教學資源,使用靈活多樣的教學方式。