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

前言

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

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

在編程逐漸普及的過程中,出現(xiàn)了兩種不同的聲音。一種是編程對數(shù)學(xué)基礎(chǔ)要求很高,數(shù)學(xué)基礎(chǔ)不好,編程也肯定學(xué)不好;另一種是無論誰都可以從編程學(xué)習(xí)中獲益,編程并不需要太好的數(shù)學(xué)基礎(chǔ)。

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

問題1:編程=信息學(xué)奧賽?

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

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

問題2:編程是什么?

信息學(xué)奧賽是不是編程?是!

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

這好比是問:100以內(nèi)的加減法是不是數(shù)學(xué)?費(fèi)馬大定理是不是數(shù)學(xué)?它們當(dāng)然都是數(shù)學(xué)!

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

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

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

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

問題3:為什么信息學(xué)奧賽如此受關(guān)注?

信息學(xué)奧賽是與數(shù)學(xué)奧賽、物理奧賽、化學(xué)奧賽和生物奧賽并列的五大學(xué)科奧賽之一。

目前國內(nèi)面向青少年的信息學(xué)奧賽,從難度與規(guī)模來說,分為下面4個階段。

●省級考試:CSP-J/S

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

●省選級考試:NOIP

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

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

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

●全國級比賽:NOI

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

●國際級中學(xué)生比賽:IOI

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

問題4:編程和數(shù)學(xué)到底是什么關(guān)系?

這取決于學(xué)編程的目的。

如果就是想?yún)⒓有畔W(xué)奧賽學(xué)編程,那編程與數(shù)學(xué)絕對是強(qiáng)相關(guān)。因為信息學(xué)奧賽本身承載了選拔的重任,而數(shù)學(xué)能力是最基礎(chǔ)的。具體地說,信息學(xué)奧賽主要涉及離散數(shù)學(xué)的內(nèi)容,知識點(diǎn)涵蓋計數(shù)、數(shù)論、集合論、圖論、數(shù)理邏輯、離散概率、矩陣運(yùn)算等。思維和方法方面,對遞歸和分治的要求比較高。當(dāng)然,除了數(shù)學(xué)能力,信息學(xué)奧賽還對閱讀理解、問題分解、編碼與調(diào)試等一系列綜合能力有一定的要求。

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

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

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

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

問題6:孩子學(xué)習(xí)編程的語言怎么選擇?

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

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

問題7:圖形化編程能訓(xùn)練計算思維嗎?

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

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

從本質(zhì)上來說,計算思維的訓(xùn)練與具體的編程語言無關(guān)。這就好比一個人的文學(xué)修養(yǎng)與他所使用的語言沒有關(guān)系,作家用文言文可以寫出優(yōu)秀的文學(xué)作品,用現(xiàn)代白話文和英文也一樣。

問題8:編程會影響學(xué)科類課程的學(xué)習(xí)嗎?

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

有這個顧慮是很正常的,但如果學(xué)習(xí)的目的是訓(xùn)練計算思維、培養(yǎng)編程素養(yǎng),這樣的擔(dān)憂就是沒有必要的。

我們不妨來看看編程能培養(yǎng)孩子的哪些能力。

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

一個稍微復(fù)雜一點(diǎn)兒的問題往往由若干個子問題構(gòu)成,其中有些是我們熟悉的,可以利用現(xiàn)有的程序,有些是我們需要去編寫的。編程學(xué)習(xí)非常有助于提高孩子們的問題分析能力。

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

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

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

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

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

本書的特點(diǎn)

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

什么是計算思維?

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

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

“計算思維是涉及確切表達(dá)問題及其解決方案的思維過程,使解決方案以一種信息處理代理可以有效執(zhí)行的形式來表示?!?/span>

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

計算思維同時借鑒了數(shù)學(xué)思維和工程思維。然而,與數(shù)學(xué)不同的是,我們的計算系統(tǒng)受到底層“信息處理代理”及其操作環(huán)境的物理限制。因此,我們必須擔(dān)心邊界條件、故障、惡意代理和現(xiàn)實世界的不可預(yù)測性。但與其他工程學(xué)科不同,由于我們獨(dú)特的“秘密武器”軟件的存在,在計算中我們可以構(gòu)建不受物理現(xiàn)實約束的虛擬世界。因此,在網(wǎng)絡(luò)與數(shù)字世界中,我們的創(chuàng)造力僅受想象力的限制。

計算思維可以被描述為“像計算機(jī)科學(xué)家一樣思考”,但它現(xiàn)在是每個人都需要學(xué)習(xí)的重要技能,無論人們是否想成為計算機(jī)科學(xué)家!有趣的是,計算思維和計算機(jī)科學(xué)并不完全與計算機(jī)有關(guān),它們更多地與人有關(guān)。計算思維的訓(xùn)練甚至可以完全脫離計算機(jī)而存在!你可能認(rèn)為我們?yōu)橛嬎銠C(jī)編寫程序,但實際上我們是為人編寫程序—編寫程序的最終目的是幫助人們交流、查找信息和解決問題。

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

一門教授計算思維的課,應(yīng)該教會學(xué)生以下5個方面的內(nèi)容。

●描述一個問題。

●確定解決此問題所需的重要細(xì)節(jié)。

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

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

●評估這個過程。

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

計算思維

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

1.抽象

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

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

計算機(jī)科學(xué)家常常在多個抽象層次上工作。反復(fù)應(yīng)用抽象使我們能夠構(gòu)建越來越龐大的系統(tǒng)。最底層(至少對于計算機(jī)科學(xué)而言)是位(0和1)。在計算中,我們通?;诔橄髮訕?gòu)建系統(tǒng),這使我們能夠一次只關(guān)注一層及相鄰層之間的關(guān)系。當(dāng)我們用高級語言編寫程序時,我們不必?fù)?dān)心底層硬件、操作系統(tǒng)、文件系統(tǒng)或網(wǎng)絡(luò)的細(xì)節(jié)。

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

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

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

2.分解

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

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

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

制作蛋糕

1.烤蛋糕

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

混合原材料

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

放入烤箱烤30分鐘

從鋁合金模具中取出蛋糕

2.打發(fā)奶油

3.將奶油涂在蛋糕上

3.算法思維

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

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

4.泛化和模式

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

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

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

5.評估

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

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

6.邏輯

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

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

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

一個甜甜圈的例子

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

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

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

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

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

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

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

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

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

類型A:每個3.00元

類型B:每個1.60元

類型C:每個2.00元

類型D:每個2.10元

類型E:每個2.15元

按類型劃分的甜甜圈數(shù)量:

25個甜甜圈A,每個3.00元

30個甜甜圈B,每個1.60元

10個甜甜圈C,每個2.00元

15個甜甜圈D,每個2.10元

30個甜甜圈E,每個2.15元

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

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

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

甜甜圈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(元)

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

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

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

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

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

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

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

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

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

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

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

主站蜘蛛池模板: 通辽市| 潼南县| 普兰店市| 精河县| 巴彦县| 东阿县| 邵东县| 广宁县| 广南县| 阜康市| 腾冲县| 平和县| 衡南县| 信宜市| 博兴县| 江安县| 山阳县| 迭部县| 营山县| 铜梁县| 阿拉善左旗| 襄汾县| 洪泽县| 辽中县| 方正县| 青铜峡市| 德江县| 穆棱市| 鄯善县| 永康市| 潞城市| 博白县| 天峻县| 淄博市| 潮安县| 霍州市| 咸宁市| 陆川县| 迭部县| 丰宁| 呼图壁县|