官术网_书友最值得收藏!

前言

不搞信息學奧賽,為什么還要學編程?

在我策劃和寫作本書的時候,有許多家長問:“孩子到底要不要學編程?”雖然人工智能已經漸漸普及,但依然有大量的家長并不知道要不要讓孩子學編程,也不知道該怎么學。部分家長的心態很現實:“學編程能帶給孩子什么,特別是,能不能對升學有幫助?”

在編程逐漸普及的過程中,出現了兩種不同的聲音。一種是編程對數學基礎要求很高,數學基礎不好,編程也肯定學不好;另一種是無論誰都可以從編程學習中獲益,編程并不需要太好的數學基礎。

那么,到底哪一種是對的呢?下面8個問題的回答將為大家釋疑。

問題1:編程=信息學奧賽?

產生上面不同聲音的一大原因是許多人在信息學奧賽(全稱為全國青少年信息學奧林匹克競賽)和編程之間畫上了等號,但顯然這是不正確的。信息學奧賽只是編程的一個小子集。這就跟我們所有人都要學數學,但只有極少數人會去參加數學奧賽是一個道理。

在編程門檻日益降低的當下,一般的編程只需要一定的邏輯思維能力即可。大部分的核心算法和框架都是現成的,普通的編程人員只要按需將它們組裝起來就能實現某個特定的功能。所以,千萬不要把程序員的職業想得有多“高大上”,大部分程序員只是代碼的搬運工和組裝者。但參加信息學奧賽則不同,參賽者需要非常強的數學能力、問題分析能力和問題解決能力。即便是一名擁有多年工作經驗的老程序員,在面對信息學奧賽的問題時,解答不出來也是很正常的。

問題2:編程是什么?

信息學奧賽是不是編程?是!

孩子組裝個機器人、搭個積木是不是編程?也是!

這好比是問:100以內的加減法是不是數學?費馬大定理是不是數學?它們當然都是數學!

所以,編程到底是什么呢?

編程的目的是讓計算機幫助人類解決問題。為了使計算機能夠理解人的意圖,人類就必須將需要解決的問題的思路、方法和手段通過計算機能夠理解的形式告訴計算機,使得計算機能夠根據人給出的指令一步一步地去完成某項特定任務。這種人和計算機之間交流的過程就是編程。

編程的難易主要取決于兩個方面:一是程序設計語言的友好性,二是所要解決問題的難度。其中,起決定性作用的是后者。從最早的機器語言到匯編語言,再到高級語言,再到現在的圖形化編程語言,程序設計的語法已經變得越來越友好了。但無論用哪種編程語言,能寫出可以解決“八皇后問題”的程序的程序員還真不多(“八皇后問題”在本套書的基礎篇第6章介紹)。

這就好比英國人覺得法語要比中文容易學。但不管怎樣,只要肯學,學會一門語言并能與人交流并不是太難的事,但要用這門語言創作一首詩歌或一篇小說,則要難得多。

問題3:為什么信息學奧賽如此受關注?

信息學奧賽是與數學奧賽、物理奧賽、化學奧賽和生物奧賽并列的五大學科奧賽之一。

目前國內面向青少年的信息學奧賽,從難度與規模來說,分為下面4個階段。

●省級考試:CSP-J/S

CSP是非專業級計算機軟件能力認證標準,分為CSP-J(入門級,Junior)和CSP-S(提高級,Senior),均涉及算法和編程。每年的9月初賽,形式為筆試;10月復賽,形式為機考。

●省選級考試:NOIP

全國青少年信息學奧林匹克聯賽(NOIP)自1995年至今(除2019年外),每年由中國計算機學會(CCF)統一組織。NOIP在同一時間、不同地點以各省市為單位由特派員組織考試,全國統一大綱、統一試卷。高中或其他中等專業學校的學生可報名參加聯賽。聯賽分初賽和復賽兩個階段。初賽考查通用和實用的計算機科學知識,以筆試為主。復賽考查程序設計能力,須在計算機上調試完成程序設計。聯賽分普及組和提高組兩個組別,難度不同。

2019年8月,CCF發布公告稱NOIP從2019年起暫停。在暫停NOIP比賽后,CCF在同年8月23日宣布舉辦CSP-J/S非專業級軟件能力認證活動。2020年9月,CCF發布通知恢復舉辦NOIP,并指出:凡是在由CCF認定的國內國際程序設計競賽中或能力認證(CSP-S)活動中取得優秀成績的學生可以獲得NOIP的參賽資格;學生也可以通過CCF認可的指導教師的推薦獲得NOIP的參賽資格,但推薦人數有限,大部分的學生如果想要參加NOIP,還是要先通過CSP-S。

通知中還指出:參加NOIP是參加NOI(全國青少年信息學奧林匹克競賽)的必要條件,不參加NOIP將不具有參加NOI的資格。因此,可以認為CSP-S是NOIP的選拔賽,NOIP是考生參加NOI的必要條件。

●全國級比賽:NOI

NOI即全國青少年信息學奧林匹克競賽,是面向初、高中或其他中等專業學校學生的全國性質的編程最高級別比賽。每年在NOI中取得優異成績的學生可以進入國家集訓隊(50名)。

●國際級中學生比賽:IOI

IOI(國際信息學奧林匹克競賽)是面向全世界中學生的一年一度的信息學學科競賽,每個國家最多可選派4名選手參加。

問題4:編程和數學到底是什么關系?

這取決于學編程的目的。

如果就是想參加信息學奧賽學編程,那編程與數學絕對是強相關。因為信息學奧賽本身承載了選拔的重任,而數學能力是最基礎的。具體地說,信息學奧賽主要涉及離散數學的內容,知識點涵蓋計數、數論、集合論、圖論、數理邏輯、離散概率、矩陣運算等。思維和方法方面,對遞歸和分治的要求比較高。當然,除了數學能力,信息學奧賽還對閱讀理解、問題分解、編碼與調試等一系列綜合能力有一定的要求。

那如果不參加信息學奧賽呢?編程和數學就沒有那么強相關,有些時候甚至可以說是弱相關。現在編程的門檻越來越低,有些編程工作其實只是簡單地做了些功能的調用。程序員懂一些基本的編程語法,會閱讀接口的說明書,就能實現一些很有用的功能了。要求稍高一點的,需要自己原創一些代碼,這時對邏輯思維能力和抽象能力的要求也就更高。再難一點兒,涉及核心的算法,那數學能力就必不可少。我國的程序員數量不少,整個群體結構呈金字塔狀,涉及核心算法的群體屬于金字塔塔尖,實屬少數,大部分程序員并不需要學習太復雜的數學知識。

問題5:什么時候開始學編程合適?

如今,市場上有些機構宣傳孩子在幼兒園階段就可以開始學編程,讓一些不明就里的家長無所適從。我個人認為,除了極少天賦異稟的孩子,大部分孩子在5歲以前邏輯思維尚不健全,很難明白編程的內涵。而且,即便是學普通的編程,最基本的四則運算和邏輯運算也是必備的基礎,從課內的數學教學進度來看,至少得要小學二年級以后才適合學習編程。

很多家長想借鑒孩子學英語的經驗,希望孩子在編程方面也能像學英語一樣早早起跑。我并不是說更小的孩子不能學編程,只是編程和英語真的不一樣。孩子從小開始學習英語,學3年,它的效果很明顯,晚學的孩子花幾個月時間根本追不上。但換成編程就不一樣,同等智力的孩子,從5歲開始先學3年編程,后學的孩子用短則兩三個月、長則半年的時間就能追上。所以,思維沒有到一定地步,過早開始學習編程反而會事倍功半。

問題6:孩子學習編程的語言怎么選擇?

如果想讓孩子早點兒接觸編程并對編程產生興趣,那可以先讓孩子接觸圖形化編程。待孩子理解了程序的工作原理,后面想讓孩子參加信息學奧賽的家長可以選擇在四年級以后讓孩子學習C++代碼編程。數據表明,信息學奧賽頂級選手的成績與起步時間沒有明顯的相關性,因此,家長大可不必擔心孩子是不是學習編程起步晚了。

如果孩子數學天賦一般,或者家長并沒想讓孩子參加信息學奧賽,只是純粹想讓孩子體驗編程的樂趣并建立計算思維,那么對于圖形化編程的學習可以持續到五六年級。再往后,Python是一個不錯的選擇,因為使用Python可以很快做出一些很酷的程序。

問題7:圖形化編程能訓練計算思維嗎?

有些家長認為訓練計算思維一定需要學C++或Python這類編程語言才行,而圖形化編程只是搭搭積木,沒法訓練計算思維。其實,這種認知是片面的。

圖形化編程目前看起來沒有起到很好的訓練計算思維的效果,問題不在于圖形化編程本身,而在于市場把圖形化編程的學習下沉得太厲害,很多機構已經把圖形化編程下沉到三年級以下。幼兒園甚至是小學一二年級的小朋友,大都不具備邏輯與數學基礎,對這個階段的孩子進行計算思維的培養實在有點“巧婦難為無米之炊”。如果孩子在更高的年級(比如小學的四至六年級)去學圖形化編程,那圖形化編程完全可以作為計算思維訓練的載體。

從本質上來說,計算思維的訓練與具體的編程語言無關。這就好比一個人的文學修養與他所使用的語言沒有關系,作家用文言文可以寫出優秀的文學作品,用現代白話文和英文也一樣。

問題8:編程會影響學科類課程的學習嗎?

有些家長會有這樣的顧慮:孩子學編程需要花費大量的時間,等到進入初中后會不會影響學科類課程的學習?也正因為此,進入初中后,很多家長就不再支持孩子學編程了。

有這個顧慮是很正常的,但如果學習的目的是訓練計算思維、培養編程素養,這樣的擔憂就是沒有必要的。

我們不妨來看看編程能培養孩子的哪些能力。

編寫程序是為了解決某個具體問題,但這個問題通常是以某種情景表現的,不像數學題那樣抽象。因此,編程學習首先有助于提高孩子的問題理解、分析和抽象的能力。

一個稍微復雜一點兒的問題往往由若干個子問題構成,其中有些是我們熟悉的,可以利用現有的程序,有些是我們需要去編寫的。編程學習非常有助于提高孩子們的問題分析能力。

在編寫程序的過程中,邏輯思維能力極為重要。程序里用得最多的就是邏輯判斷和循環。滿足什么條件執行哪個分支程序,滿足什么條件退出循環,這些問題的解決都需要較高的邏輯思維能力。當然,如果沒有良好的數學素養,寫出的程序可能并不理想。擁有良好數學思維的人往往可以寫出非常簡潔且高效的程序。

寫程序常常是一個不斷優化的過程。一開始寫出的可執行程序,往往效率并不那么高,結構并不那么美。這時,我們可以不斷去尋找更優化的方法,不斷提升程序的效率和可讀性。因此,編程能鍛煉孩子不斷優化、追求卓越的品質。

數學題解錯了,如果我們不驗算,就很難看出來,更何況有些數學題也不好驗算。但程序不允許一絲一毫的馬虎,錯了要么無法運行,要么執行結果不符合我們的預期。編程不允許半點兒粗心,一旦發現了錯誤,就得像福爾摩斯一樣去尋找問題所在。有可能一個不經意的小錯誤,我們得花上半天甚至更長時間才能找出癥結。所以,編程非常有助于幫助孩子克服粗心的毛病,鍛煉孩子的耐心,提高孩子的錯誤診斷能力。

對于一個大型的程序,我們常常需要幾個人一起協作完成。這個時候,程序就不單單是寫給自己看,還要讓別人也能看得懂。因此,編程非常有助于鍛煉孩子的團隊協作能力和結構化與模塊化思維。

沒錯,編程確實很花時間。如果連學科內容都學得吃力,那我不建議去學編程。如果學有余力并且對編程感興趣,那在學習編程的過程中無論是直接或間接獲得的能力,對孩子的學科類學習和長遠發展都是有益的。

本書的特點

我發現目前的編程教育存在一個問題,就是重算法、輕結構。我在大學從事計算機專業的教學工作,在工作中發現這個問題在本科生或研究生寫的程序里體現得非常明顯。我曾經參與起草由全國高等學校計算機教育研究會、全國高等院校計算機基礎教育研究會、中國軟件行業協會、中國青少年宮協會4個團體聯合發布的《青少年編程能力等級》中的圖形化編程部分。在那篇標準文件中,我把數學思維和結構化思維的培養放在了與算法同等重要的位置。這一思想也貫穿了本書的撰寫過程。本書并不是簡單地讓孩子搭積木玩,也并非止步于了解一下編程的規則,而是更側重于計算思維和編程素養的培養,因此更適合于小學中高年級的孩子,也適合從事少兒編程教育的從業者。

什么是計算思維?

我們生活在一個數字世界,軟件和技術已經徹底改變了我們的生活。為了能游刃有余地生活和工作,我們需要了解自己所生活的這個數字世界。這就是計算思維被稱為“21世紀必備技能”的原因,它對每個人而言都很重要。學習計算思維對于了解數字世界的運作方式、利用計算機的力量解決棘手的問題都至關重要。它還能幫助我們進行批判性的思考,不僅可了解某些技術的好處,也懂得它們的潛在危害、道德影響或意外后果。

雖然我們在這里及前文中多次提及了計算思維,但究竟什么是計算思維呢?讓我們來看看卡內基梅隆大學周以真教授的學術定義:

“計算思維是涉及確切表達問題及其解決方案的思維過程,使解決方案以一種信息處理代理可以有效執行的形式來表示。”

聽起來夠繞吧?但其實,這只是用高大上的語言來表達簡單的想法。“信息處理代理”是指任何遵循一組指令來完成任務(我們稱之為“計算”)的東西。大多數情況下,這個“代理”是指計算機或其他類型的數字設備—但它也可以是人!為了使事情變得簡單,我們將其稱為計算機。為了以計算機可以執行的方式表示解決方案,我們必須將它們表示為一步一步的過程,即算法。為了創建這些算法解決方案,我們應用了一些特殊的問題解決技能。這些技能構成了計算思維,它們可以遷移到任何領域。

計算思維同時借鑒了數學思維和工程思維。然而,與數學不同的是,我們的計算系統受到底層“信息處理代理”及其操作環境的物理限制。因此,我們必須擔心邊界條件、故障、惡意代理和現實世界的不可預測性。但與其他工程學科不同,由于我們獨特的“秘密武器”軟件的存在,在計算中我們可以構建不受物理現實約束的虛擬世界。因此,在網絡與數字世界中,我們的創造力僅受想象力的限制。

計算思維可以被描述為“像計算機科學家一樣思考”,但它現在是每個人都需要學習的重要技能,無論人們是否想成為計算機科學家!有趣的是,計算思維和計算機科學并不完全與計算機有關,它們更多地與人有關。計算思維的訓練甚至可以完全脫離計算機而存在!你可能認為我們為計算機編寫程序,但實際上我們是為人編寫程序—編寫程序的最終目的是幫助人們交流、查找信息和解決問題。

例如,我們使用智能手機上的應用程序來獲取前往朋友家的路線。這個應用程序就是計算機程序的一個例子,而智能手機是為我們運行該程序的“信息處理代理”。那些設計計算最佳路線的算法,以及設計交互界面和如何存儲地圖等所有細節的人,都應用了計算思維來設計這個應用。但他們設計這個應用并不是為了智能手機,而是為了幫助使用智能手機的人。

一門教授計算思維的課,應該教會學生以下5個方面的內容。

●描述一個問題。

●確定解決此問題所需的重要細節。

●把問題分解成小的、合乎邏輯的步驟。

●使用這些步驟來創建解決問題的流程(算法)。

●評估這個過程。

事實上,業界對計算思維有多種定義,但大多數定義都涉及計算思維背后體現的解決問題所必備的技能。

計算思維

下面,我列出6種重要的技能。

1.抽象

計算思維中最重要和最高級的思維過程是抽象。抽象的作用是簡化事物,它賦予我們處理復雜問題的能力。抽象需要確定問題最重要的方面是什么,并隱藏我們不需要關注的其他具體細節。我們根據問題最重要的方面來創建原始事物的模型。然后,我們可以使用這個模型來解決問題,而不必一次處理所有的細節。

抽象用于定義模式、將個體實例泛化和參數化。抽象的本質是在個性中找共性,它識別出一組對象共有的屬性,同時隱藏它們之間不相關的區別。例如,算法是一個過程的抽象,它接受輸入、執行等一系列步驟并產生預期的目標輸出。一個排序算法既可以對一組數排序,也可以對一組學生姓名排序。抽象數據類型定義了一組抽象的值和用于操作這些數據的操作,對使用這些數據類型的用戶隱藏了數據的實際表示,這就好比駕駛汽車的人只需關心方向盤、油門、剎車等的使用即可,不需要知道內部引擎是怎么工作的。

計算機科學家常常在多個抽象層次上工作。反復應用抽象使我們能夠構建越來越龐大的系統。最底層(至少對于計算機科學而言)是位(0和1)。在計算中,我們通常基于抽象層構建系統,這使我們能夠一次只關注一層及相鄰層之間的關系。當我們用高級語言編寫程序時,我們不必擔心底層硬件、操作系統、文件系統或網絡的細節。

我們在日常生活中經常使用抽象。比如,地圖通過省略不必要的細節(例如公園中每一棵樹的位置),只保留地圖閱讀器所需要的最關鍵信息,例如道路和街道名稱,向我們展示了整個世界的簡化版本。

計算機一直都在使用抽象對用戶隱藏盡可能多的不必要信息。例如,假設你在上次旅行中拍了一張漂亮的風景照片,現在你想在計算機上對它進行編輯并調整其中的顏色。通常我們可以通過打開圖片編輯程序、調整一些顏色滑塊或選擇過濾器來做到這一點。當你這樣做時,會有很多復雜的操作發生,而這些操作是計算機對你隱藏的。

你拍的照片在計算機上是作為一個像素陣列存儲的,每個像素有不同的顏色,每種顏色都用一組數字表示,每一個數字都存儲為二進制數!這將是非常多的信息。想象一下,如果你在調整顏色時必須查看每個像素的顏色值對應的二進制數并更改其中的一部分,那會不會崩潰?好在計算機為你隱藏了這些信息,因此你不需要知道這些二進制信息就能達成你的目標。

2.分解

分解是將一個復雜的問題分解為更小、更簡單的部分,然后專注于解決每個小問題。這些更小、更簡單的問題的解決方案組合成了我們最初的大問題的解決方案。分解有助于讓大問題變得不那么令人生畏!

由于計算機需要非常具體的指令,因此分解是創建可在計算設備上實現的算法和過程的一項重要技能。我們需要告知計算機它應該遵循的每一個步驟,才能讓計算機幫助我們做事。

例如,制作蛋糕的整個任務可以分解為幾個較小的任務,每個任務都可以輕松執行。

制作蛋糕

1.烤蛋糕

將原材料(黃油、糖、雞蛋、面粉)放入碗中

混合原材料

將混合的原材料倒入鋁合金模具

放入烤箱烤30分鐘

從鋁合金模具中取出蛋糕

2.打發奶油

3.將奶油涂在蛋糕上

3.算法思維

算法是計算思維和計算機科學的核心。在計算機科學中,問題的解決方案不僅僅是一個答案,而是算法。算法是解決問題或完成任務的一步步過程。如果我們正確地遵循算法的步驟,即使對于不同的輸入,也會得到正確的答案。例如,我們可以使用算法來找到地圖上兩個地點之間的最短路線。相同的算法可應用于任何一對起點和終點,因此最終的答案取決于算法的輸入。如果我們知道解決問題的算法,那么我們隨時可以輕松解決這類問題而無須思考!我們只需按照步驟操作。計算機自己并不能思考,所以我們需要給它們算法,告訴它們怎么做事。

算法思維是創造算法的過程。當我們創建一個算法來解決一個問題時,我們把創建出的算法稱為算法解決方案。算法的構成元素相對較少,因為計算設備只有幾種類型的指令可以遵循。它們可以做的主要事情是接收輸入、提供輸出、存儲值、按順序執行指令、根據分支進行選擇和在循環中重復執行指令。盡管指令的范圍非常有限,卻描述了計算設備可以計算的所有內容,這就是為什么我們要將算法描述為僅限于這些元素的過程。

4.泛化和模式

泛化也被稱為“模式識別和泛化”。泛化是將問題的解決方案(或解決方案的一部分)進行普適化,以便它可以應用于其他類似的問題和任務。由于計算機科學中的解決方案是算法,這意味著我們將一種算法變得足夠通用,它就可以解決一系列問題。這個過程涉及抽象。為了使事物更通用,我們必須剔除與特定問題或場景相關但對算法的運行而言并不重要的細節。

發現模式是這個過程的重要組成部分。當我們思考多個問題時,我們可能會認識到它們之間的相似之處,并發現它們可以用相似的方式予以解決。這被稱為模式匹配,也是我們的日常生活每時每刻在做的事情。

泛化的算法可以被重用,用于解決一組相似的問題,這意味著我們可以快速有效地提出解決方案。

5.評估

評估涉及找出解決問題的多種算法,并判斷哪種算法最好用,它們是否在某些情況下有效但在其他情況下無效,以及如何改進它們。在評估一個算法方案時,我們需要考慮一系列因素。例如,這些過程(算法)求解問題需要多長時間,它們是否可擴展,是否能夠可靠地解決問題,或者是否在某些情況下會以非常不同的方式執行。評估是我們在日常生活中經常做的事情,常常,我們還需要用戶的反饋來幫助我們改進方案。

我們可以通過不同的方式來評估算法。比如,可以通過在計算機上實現并運行算法來測試它們的速度;或者可以從理論上分析算法需要的執行步數。我們可以通過給算法許多不同的輸入并檢查它們是否按預期工作來測試它們是否正確。此時,需要考慮用于測試的不同輸入。我們并不想檢查每一個可能的輸入(通常有無數個可能的輸入),但仍然需要確認所給出的算法是否對所有輸入都有效。測試是計算機科學家和程序員一直在做的事情。但是,因為我們通常無法測試所有可能的輸入,所以我們也會嘗試使用邏輯推理來評估算法。

6.邏輯

在嘗試解決問題時,我們需要進行邏輯推理。邏輯推理是指通過觀察、收集數據、思考,然后根據已知事實搞清楚整個事情的緣由,從而試圖完整地理解事物。

例如,假設你正在編寫軟件來計算從你家到某個位置的最短路線。在地圖上看,如果你從家向北走,到圖書館需要2分鐘,但如果你向南走,則需要3分鐘才能到達下一個十字路口。你可能想知道:如果一開始就向南走,去圖書館是否有更好的路線?顯然,從邏輯上講這不可能,因為你需要步行3分鐘才能到達第一個十字路口。

在更深層次上,計算機的運行完全建立在邏輯之上。它們使用“真”和“假”,并使用被稱為“布爾表達式”的東西(比如“年齡>5”)在計算機程序中做出決定。追蹤程序中的錯誤的位置和原因也需要用到邏輯思維。

一個甜甜圈的例子

最后,以一個甜甜圈的例子來形象地說明什么是計算思維。

假設我們現在有一個任務,要從商店帶甜甜圈給我們的同學。我們收集了每個人的訂單,形成了一張110個甜甜圈的購買清單列表,我們希望在去商店之前計算出所有甜甜圈的總價格。計算思維可以幫助我們更容易地解決這個問題。

我們首先定義問題:計算110個甜甜圈的總價格。

看到這個問題時,我們的第一反應通常是拿起自己的手機,并將甜甜圈的價格一個個累加起來。這個方法可行,卻是一種低效的方法。計算思維為我們提供了一種更好、更省力的方式。

我們可以將問題分解為更小的步驟(分解)。

(1)給出每種甜甜圈的價格。

(2)給出我們購買的每種甜甜圈的數量。

一旦知道了這兩點,就可以計算出總價格,下面給出了一個實例。

不同類型甜甜圈的單價表:

類型A:每個3.00元

類型B:每個1.60元

類型C:每個2.00元

類型D:每個2.10元

類型E:每個2.15元

按類型劃分的甜甜圈數量:

25個甜甜圈A,每個3.00元

30個甜甜圈B,每個1.60元

10個甜甜圈C,每個2.00元

15個甜甜圈D,每個2.10元

30個甜甜圈E,每個2.15元

現在,通過把甜甜圈按照類型和數量有序組織成價格列表,我們發現列表中的每一項都遵循相同的模式(發現模式),這使我們能夠建立一個公式來計算每種甜甜圈的總價格。

甜甜圈A的總價格:25個×3.00元/個=75元

對于模式化的數據類型,可以對列表中的每一項簡單地重復使用這個公式。

甜甜圈B的總價格:30個×1.60元/個=48元

甜甜圈C的總價格:10個×2.00元/個=20元

甜甜圈D的總價格:15個×2.10元/個=31.5元

甜甜圈E的總價格:30個×2.15元/個=64.5元

最后,我們可以將每種類型的甜甜圈價格相加來計算總價格。

75+48+20+31.5+64.5=239(元)

有了用于解決每個小問題的公式,我們可以抽象出一個模板,其中包含兩個計算價格的公式。

按類型劃分的項目數×單價=每個項目類型的價格

項目A的價格+項目B的價格+項目C的價格+…=總價格

這個公式不僅可以用于甜甜圈價格的計算,也同樣適用于紙杯蛋糕、冰淇淋、三明治的價格計算,當然也適用于甜甜圈數量更多的情況。在消除了最初問題中的復雜性后,這個公式現在成了一個易于使用的工具(泛化)。

然后,我們可以進一步擴展從這一經驗中獲得的知識,通過構建算法來確保每次都能獲得可靠的輸出,以便在其他需要計算的活動中復用它(算法思維)。

第1步:按類型添加項目。

第2步:為每個項目類型設置單價。

第3步:將按類型劃分的項目數與其單價相乘。

第4步:將每種類型的總價格加在一起。

我們來評估一下這個方法。首先,它總是可以正確地完成計算總價格的任務。其次,抽象出來的模板和算法有很強的復用性。最后,這種方法可擴展性較強,即按這種方式來計算總價格的速度要遠遠快于逐個相加的方法,特別是在數量變得越來越多的時候(評估)。

正如這個小例子所希望展示的那樣,這個過程體現了我們解決問題方式的轉變。通過公式化的過程,我們可以駕馭復雜性并專注于重要的事情,不會在復雜性中迷失解決問題的方向。盡管這只是計算思維的一個簡單例子,但很明顯,這個過程可以被復制并用于解決大量數據的問題,并在充滿數據的世界中引導未知的旅程。

主站蜘蛛池模板: 昭通市| 洞头县| 金山区| 电白县| 黔西县| 封丘县| 宜兴市| 永福县| 弋阳县| 即墨市| 莲花县| 巴彦县| 横山县| 桓仁| 绥棱县| 利川市| 西安市| 大英县| 平邑县| 兴隆县| 子长县| 阜城县| 阳新县| 侯马市| 花垣县| 大同市| 通化县| 京山县| 黔江区| 手游| 湘潭市| 平塘县| 方山县| 庆安县| 手游| 梓潼县| 威远县| 尉犁县| 武城县| 防城港市| 获嘉县|