天天看點

王榮良 | 算法、程式設計在計算思維教育中的作用

作者:中國資訊技術教育
王榮良 | 算法、程式設計在計算思維教育中的作用

探索:算法教學如何有效

促進學生計算思維發展

算法是大學計算機專業的核心課程。算法學習的主要内容有算法政策(如窮舉、貪心、分治、回溯)、算法執行個體(如查找、排序、周遊、哈希以及基于隊列、堆棧、二叉樹、圖等資料結構的具體算法)、關于算法複雜性的分析。

《普通高中資訊技術課程标準(2017年版)》指出,一個具備計算思維的學生,必須具備三方面的特征:

①在資訊活動中能夠采用計算機可以處理的方式界定問題、抽象特征、建立結構模型、合理組織資料;

②通過判斷、分析與綜合各種資訊資源,運用合理的算法形成解決問題的方案;

③總結利用計算機解決問題的過程與方法,并遷移到與之相關的其他問題解決中。據此可知,掌握算法是計算思維的三大必備要求之一。

國小五年級課标算法子產品關于計算思維的要求是:通過生活中的執行個體,了解算法的特征與效率;能用自然語言、流程圖等方式描述算法;知道解決同一問題可能會有多種方法,認識到采用不同方法解決同一問題時可能存在時間效率上的差别。例如,可以采用“煎蛋算法”作為國小生計算思維培養的學習材料:A同學每天早上要煎三個雞蛋作為早餐,每煎一個雞蛋需要2分鐘,鍋裡最多可同時煎兩個雞蛋,請問煎蛋最少需要用時幾分鐘?可選擇的答案分别是:A、2分鐘;B、3分鐘;C、4分鐘;D、6分鐘。

初心:計算機學科的基本問題

如何才能最大限度地實施計算思維的培養?下面,筆者回歸計算思維的本源,考察計算思維對應的計算機學科以及計算思維是如何支援解決該學科的根本問題的。

計算機學科是研究計算機的設計、制造和利用計算機進行資訊擷取、表示、存儲、處理、控制等理論、原則、方法和技術的學科。計算機學科的根本問題是關于可計算問題的研究,或者說是解決計算機進行問題求解的可行性,即什麼能被有效的自動化。可計算問題通常可以用一種抽象的形式系統即計算模型來刻畫。這裡的計算模型并不是指在靜态或動态數學描述基礎上所建立的求解某一個問題計算方法的數學模型,如圓面積或者BMI指數之類的計算公式,而是具有狀态轉換特征,能夠對所有處理對象的資料或資訊進行表示、加工、變換、接收、輸出的數學機器。

在計算機學科,存在這樣一條定律:一個問題,當它的描述及其求解方法或求解過程可以用構造性數學描述,而且該問題所涉及的論域為有窮的,或為無窮但存在有窮表示時,那麼這個問題一定能用計算機求解;反之,凡是能用計算機求解的問題,也一定能對該問題的求解過程數學化,而且這種數學化是構造性的。是以,一個問題在判明為可計算的性質後,從具體解決這個問題考慮,必須按照可構造的特點與要求,給出實際解決該問題的具體操作,同時還必須確定開銷成本是能夠承受的。

是以,計算機學科的根本問題可以用兩個關鍵詞來表述——“可計算”和“構造”,即在計算機科學理論的基礎上判定問題是否可計算,并且可以運用由其學科理論所支援的技術來構造可計算。計算思維作為計算機學科思維,在支援人們通過構造計算模型以及構造具體的操作步驟判定可計算進而實作自動化的工作中,具有重要的作用。

分析“煎蛋算法”教學案例,可以發現,盡管經曆了問題分析,也提出了煎蛋的操作步驟,但學生的關注重點在于完成煎蛋最短時間是3分鐘還是4分鐘,其煎蛋步驟的設計是為最短3分鐘服務的,可以說這隻是一個數學問題。隻有當學生的關注點集中在算法步驟的有效構造上,才能夠一步一步地完成全部的煎蛋工作,其煎蛋步驟的構造是為自動化服務的,這就凸顯了“可計算”和“構造”。

設想一下,如果是一項為機器人編制煎蛋程式的教學工作,要求用程式控制機器人完成煎3個雞蛋的任務,并且還可以通過程式優化環節實作在最短的3分鐘時間内完成煎蛋任務,那麼必然要求引導學生思考算法,并在機器人或計算機上構造算法操作步驟,進而實作煎蛋的自動化。由這個案例可見,用程式描述算法與用自然語言或流程圖描述算法有不一樣的效果,程式設計教學在計算思維培養中有獨特的優勢,其特點在于構造工作是在計算機環境下實作的,明确需要運用計算機學科思維方法,其過程對于學生而言也是具體的、可體驗的。

載體:承載計算思維教學的具體内容

計算源于數學,對可計算的樸素了解,就是能用一張紙和一支筆做有限次運算就可以完成的計算。随着數學中許多計算問題得到解決以及不可計算問題的不斷積累,許多科學家認識到發展計算模型,研究最一般問題可計算的重要性。20世紀30年代是計算模型研究取得突破性進展的時期,哥德爾、丘奇、圖靈等科學家提出了一批計算模型。其中,以圖靈機的特點和性質更接近普通人計算的思想方法,進而被現代計算機系統的開發者所采納。

如果說計算模型是采用形式系統的方法對計算這一概念的刻畫,那麼,算法就是對計算過程步驟或狀态的一種刻畫,是計算方法的一種能行性實作。可計算理論證明,凡是能用算法解決的問題,也一定能用這些計算模型解決,反之,這些計算模型解決不了的問題,任何算法也解決不了。

所謂程式,是一種事先編制好的、具有特定功能的指令序列。程式編制依據的是預先設計的算法,這些算法可以是已經存儲于程式編制者大腦之中的,也可以是已經用流程圖或其他形式準确描述的。在計算機學科中,一般而言,對于任何一個問題,如果有了解決該問題的算法,就可以編制相應的程式。程式是可計算問題的最終落實。

計算模型、算法、程式構成了有關可計算問題從抽象到具象的線索。計算思維作為計算機學科思維,支援研究者對計算模型、算法、程式的研究與應用。同時,開展計算模型、算法、程式的研究與應用也是計算思維培養的有效途徑。

分析計算模型、算法、程式這一線索可以發現,對計算模型的認識與了解,以及對抽象的算法認識與了解,需要有比較強的認知能力和數學基礎。是以,針對計算機學科的初學者,尤其是中國小生,簡單化的算法和操作性強的程式是計算機學科入門級的學習内容,也是普及計算思維的途徑。

分析“煎蛋算法”教學案例,可以發現,該案例表面上是算法問題,但因為目标問題是求最少時間,是以該問題就轉化為一個數學問題,或者是用數學方法解決運籌學方面的問題,其實施過程中可能需要用到算法工具,但教學的重點已不是算法思想。這是生活化的算法在教學中經常面臨的問題。盡管算法教學應該強調每一個的操作步驟,但如果沒有經曆過程式實作,仍然缺少體驗自動化這一計算思維的重要環節。

對此,有教師認為,在開展算法教學時應該采用自然語言、流程圖描述算法,這樣在算法教學中就可以不受程式設計語言的幹擾,隻要最後采用程式驗證學生設計的算法,就能達到教學目标。其實這已經陷入了悖論,因為最終由學生實施用程式驗證算法,學生還是需要學習具體的程式設計語言用來表達算法。如果為了不學習程式設計語言而将驗證工作全部由教師代勞,那麼學生就無法感受真實的驗證。

目标:大腦成為計算模型的容器

計算模型、算法、程式這一線索從抽象到具象反映了采用計算機求解問題的邏輯路徑。計算思維的培養,依據認知規律,應該是從具象到抽象了解這一邏輯路徑,最終在大腦中形成計算模型。一個具備計算思維的人,能夠在大腦中運用建立的計算模型運作程式或算法或操作序列,即先行于計算機在大腦中運作,并且能夠将正确的執行步驟與要求準确表達與構造,進而實作用計算機求解問題。

從簡單到複雜、從具象到抽象是學習的一般規律。随着年齡的增長、認知水準的提高、計算機學科教學的不斷深入,學生對計算模型的了解也會越來越全面。初學者掌握了程式設計工具,在大腦中建立的計算模型會是一個能夠運作程式的相對具象的思維模型。

由Robert Sedgewick等編寫的《算法》一書指出,采用Java程式設計語言來學習算法的原因是:

①程式是對算法精确、優雅和完全的描述;

②可以通過運作程式來學習算法的各種性質;

③可以在應用程式中直接使用這些算法。

相比用自然語言描述算法,這些是重要而巨大的優勢。

考察高校計算機專業教學對中國小開展計算機學科教育有一定的啟示。大部分高校計算機專業都在大學一年級開設程式設計基礎課程,其目的為:

①能夠使專業初入門者直覺感受計算機自動化的工作原理,為了解抽象的計算機學科思想方法做心理建設;

②掌握一種學習資料結構、編譯原理等計算機學科後續課程的學習工具,因為這些課程的學習内容都涉及程式設計。

在後續課程中,涉及的算法有可能會用僞代碼甚至直接用自然語言描述,而不使用具體的程式設計語言。但由于學生已經有了程式設計基礎,他們在學習這些算法的時候,可以用自己大腦中建立的計算模型運作這些算法。“在大腦中運作”正是計算思維的關鍵素養。與此同時,上述課程一般都會将程式設計實作作為作業要求學生在課後完成。

采用特定的程式設計語言學習算法,存在的明顯缺陷是将算法思想從具體程式設計語言實際細節中分離變得困難。Robert Sedgewick教授在《算法》一書中采取的政策是使用Java的一個子集,而這個語句子集隻使用了大多數現代程式設計語言都能充分描述算法所必需的文法。

在基礎教育開展程式設計教學的實踐中,已經出現了不少解決此類問題的政策與方法,其中,圖形化、積木式程式設計平台可以在一定程度上避免學生對程式設計語句細節的機械記憶與過多關注。并且,程式設計積木塊功能的學習,本身就是在形象化地學習程式執行流程,即算法的分支、循環結構。在這樣的程式設計平台上,用形象的積木塊拼接來表達學生可以了解的生活事件的執行流程,并且可以直接運作,其具體、直覺的特點,符合低齡學生的學習要求。

受早期程式設計教育的影響,仍有一些教師将程式設計教學與程式員教育訓練等同,進而排斥程式設計教學的作用。開展程式設計教學不是程式員教育訓練,也不單是為了友善了解算法,重要的是體會實作程式運作的過程原理,讓學生在面對問題解決時,厘清思路、方法與手段,并規劃好步驟,一步一步地完成任務本身,以此形成一種類似于計算機程式工作中的流程,形成一種思維方式,進而提高學生在解決問題過程中的思維邏輯性。

反思:算法教學中的若幹思考

第一,算法教學與計算思維的關系問題。目前學界對計算思維的定義仍然存在争議,而在中國小計算思維教育實踐中,是否應該把算法學習的全部内容都歸類為計算思維培養,甚至把計算思維教育等同于計算機學科知識學習,是一個值得探讨的問題。随着算法教學中大量生活算法的引入,其算法政策與方法都是來源于生活常識或數學等其他學科。正如同随着教育數字化轉型,數字化學習的普及,學生數字化學習能力培養管道也普及化一樣,計算思維概念外延的不斷擴大,随之而來的是衆多學科都成為計算思維培養的陣地。不否認其他學科的學習以及學生年齡增長、認知水準提高對計算思維的養成有貢獻,但計算思維培養的主管道是什麼,應該發揮怎樣的作用非常值得思考。

第二,在算法教學中使用流程圖表征算法的問題。流程圖是一種思維可視化的工具,長期以來廣泛應用于中國小的算法教學。正因為是一種思維表達工具,學生應該能夠運用流程圖在短時間内有效表達思想。但在教學實踐中,流程圖繪制規範的要求明顯增加了學生思維表達的負荷,限制了學生思維的發展。另外,有些算法,或者面向對象程式,用正常的程式流程圖表示并不合适。從一些教師調研的結果來看,确實有不少學生是将待解決的問題在大腦中直接形成用程式表征的算法,并且可以“在大腦中運作”。重新定義流程圖在算法教學中的地位以及探究其使用政策,以促進學生思維發展也是值得思考的。

第三,如何讓中國小生喜歡算法學習的問題。義教數學課标把“對數學具有好奇心和求知欲,了解數學的價值,欣賞數學美,提高學習數學的興趣”列為課程總目标值得借鑒。學生的内在驅動力是發掘學生潛力、實作學生自我價值的必要因素。隻有當學生具有内在驅動力時,學習才是高效和高品質的。是以,為學生創造積極的學習體驗,鼓勵學生保持好奇心,通過創造表達自己是激發學生内在驅動力的重要途徑。

正如Robert Sedgewick教授所說,程式是對算法精确、優雅和完全的描述。如果受硬體裝備或其他因素制約,學生無法上機程式設計操作,那麼開展紙上談兵式的算法教學,則是一種無奈的選擇。計算思維教育最基礎的目标,是讓學生體驗、了解、實際應用、遷移這樣的觀點:在大腦中建立計算模型,在大腦中先行設計算法并運作正确,然後明确告訴計算機每一個操作步驟,使計算機能夠機械地自動化執行。

本文作者:

王榮良

華東師範大學

文章刊登于《中國資訊技術教育》

2022年第20期

繼續閱讀