李茜
什么是計(jì)算思維?
所謂“計(jì)算思維”,也就是計(jì)算機(jī)解決問題的思維,計(jì)算思維是人解決問題思維的一種抽象化。例如,計(jì)算機(jī)把我們?nèi)粘I钪行枰罁?jù)條件判斷進(jìn)而做出決定的問題抽象為分支結(jié)構(gòu),將需要重復(fù)做的事情抽象為循環(huán)結(jié)構(gòu),這樣一來(lái),許多現(xiàn)實(shí)生活中我們所遇到的問題,或者種類相似的問題,都可以通過(guò)計(jì)算思維的轉(zhuǎn)換,抽象為計(jì)算機(jī)語(yǔ)言所編寫出來(lái)的程序。
為什么要學(xué)習(xí)算法?
算法是計(jì)算機(jī)解決特定問題的確定的、有限的步驟的集合,無(wú)論學(xué)習(xí)哪門計(jì)算機(jī)語(yǔ)言,學(xué)習(xí)算法都是非常重要的,不同的算法體現(xiàn)了計(jì)算機(jī)思維的不同呈現(xiàn)方式,學(xué)習(xí)算法,對(duì)于學(xué)生理解計(jì)算思維,應(yīng)用計(jì)算思維解決問題都是非常有幫助的。
算法舉例
遞歸算法 遞歸算法是常用的編程技術(shù),其基本思想就是“自己調(diào)用自己”,它可以用簡(jiǎn)單的程序來(lái)解決某些復(fù)雜的計(jì)算問題。在程序設(shè)計(jì)中,應(yīng)用遞歸算法的關(guān)鍵即是找到遞歸的規(guī)律和遞歸終止的條件。
案例:數(shù)字黑洞153
任意取一個(gè)是3的倍數(shù)的自然數(shù)。求出這個(gè)數(shù)各個(gè)數(shù)位上數(shù)字的立方和,得到一個(gè)新數(shù);然后再求出這個(gè)新數(shù)各個(gè)數(shù)位上數(shù)字的立方和,又得到一個(gè)新數(shù),如此重復(fù)運(yùn)算下去,最后一定會(huì)掉入數(shù)字黑洞153之中。例如:69是3的倍數(shù),63+93=945,93+43+53=918,93+13+83=1242,13+23+43+23=81,83+13= 513,53+13+33=153。
接下來(lái),我們來(lái)看,如何通過(guò)算法描述來(lái)說(shuō)明計(jì)算機(jī)解決問題的思維方式。
算法如下:一是提示用戶輸入一個(gè)3的倍數(shù)。二是求這個(gè)數(shù)各個(gè)數(shù)位的立方和。三是判斷結(jié)果是否等于153?四是如果不等于153則重復(fù)2、3兩步,如果等于153,則證明其掉入黑洞153,程序結(jié)束。
這個(gè)過(guò)程和我們?nèi)四X判斷這個(gè)問題的過(guò)程非常相似,而以上描述的算法就是一個(gè)從人的思維到計(jì)算思維轉(zhuǎn)換的過(guò)程。
枚舉算法 枚舉算法是我們?cè)谌粘V谐S靡粋€(gè)算法,它的核心思想就是嘗試所有的可能。它的本質(zhì)就是從所有候選答案中去搜索正確的解,使用該算法需要滿足兩個(gè)條件:一是可預(yù)先確定候選答案的數(shù)量。二是候選答案的范圍是已知的、明確的。
案例:韓信點(diǎn)兵
秦朝末年,楚漢相爭(zhēng)。一次,韓信率1500名將士與楚王大將李鋒交戰(zhàn)后返回大本營(yíng)。當(dāng)行至一山坡,忽有后軍來(lái)報(bào),說(shuō)有楚軍騎兵追來(lái)。韓信兵馬到坡頂,見來(lái)敵不足500騎,便急速點(diǎn)兵迎敵。他命令士兵3人一排,結(jié)果多出2名;接著命令士兵5人一排,結(jié)果多出3名;他又命令士兵7人一排,結(jié)果又多出2名。韓信馬上向?qū)⑹總冃迹何臆娪?073名勇士,敵人不足500,我們居高臨下,以眾擊寡,一定能打敗敵人。
這是一個(gè)典型的枚舉算法的案例。從對(duì)韓信點(diǎn)兵這個(gè)問題分析得出:
枚舉的范圍是:1000—1500。
條件是:一是士兵數(shù)除3的余數(shù)為2;二是士兵數(shù)除5的余數(shù)為3;三是士兵數(shù)除7的余數(shù)為2。三個(gè)條件必須同時(shí)滿足。
算法如下:一是列舉1000—1500范圍內(nèi)的所有數(shù)字。二是按照“兵除3的余數(shù)為2;兵除5的余數(shù)為3;兵除7的余數(shù)為2”的條件逐一判斷。三是找到符合條件的數(shù)字立即停止判斷。
枚舉法的應(yīng)用非常廣泛,很多數(shù)學(xué)問題都可以用枚舉法來(lái)實(shí)現(xiàn),例如雞兔同籠等等。
邏輯推理 在計(jì)算思維的世界里,除了算術(shù)運(yùn)算、關(guān)系運(yùn)算,還有一種運(yùn)算叫“邏輯運(yùn)算”,邏輯運(yùn)算符有三種:非、與、或。計(jì)算機(jī)在處理問題時(shí),除了要處理和運(yùn)算有關(guān)的問題,還要處理邏輯判斷類的問題。
案例:誰(shuí)是殺手
日本某地發(fā)生了一起謀殺案,被控制的四個(gè)犯罪嫌疑人分別說(shuō)了如下供詞:
甲說(shuō):“不是我?!币艺f(shuō):“是丙?!北f(shuō):“是丁?!倍≌f(shuō):“丙在胡說(shuō)?!币阎齻€(gè)人說(shuō)了真話,一個(gè)人說(shuō)的是假話?,F(xiàn)在根據(jù)這些信息,請(qǐng)你找出到底誰(shuí)是兇手。
現(xiàn)在,我們需要編寫一個(gè)程序,讓程序幫我們判斷出“誰(shuí)是兇手”。那么,我們需要將問題轉(zhuǎn)化為計(jì)算機(jī)可以理解的形式。
首先,我們將嫌犯的陳述,對(duì)應(yīng)為下方的邏輯表達(dá)式:
已知條件:甲說(shuō):“不是我。”表達(dá)式:<殺手=1>不成立。
已知條件:乙說(shuō):“是丙?!北磉_(dá)式:<殺手=3>。
已知條件:丙說(shuō):“是丁?!北磉_(dá)式:<殺手=4>。
已知條件:丁說(shuō):“丙在胡說(shuō)?!北磉_(dá)式:<殺手=4>不成立。
接下來(lái),是如何表達(dá)四個(gè)人中有三個(gè)人說(shuō)了真話,也就是以上的四個(gè)表達(dá)式返回值之和等于3。
算法如下:一是假設(shè)兇手=1。二是判斷上方表達(dá)式中4個(gè)表達(dá)式的和是否為3。三是如果成立,則找到兇手,說(shuō)出兇手。四是如果不成立,則兇手值加1,重復(fù)步驟2、3。五是當(dāng)兇手=4,四個(gè)嫌犯都判斷完畢,兇手就在其中。
遇到類似的問題,我們需要做的,就是把已知條件和條件之間的關(guān)系表達(dá)清楚,其他的問題就交給計(jì)算機(jī)來(lái)處理。
筆者的話
生活中的很多問題都可以通過(guò)計(jì)算思維抽象成為具體的形式:如不斷變化的數(shù)值可以抽象為變量;能否滿足條件可以抽象為邏輯表達(dá)式;對(duì)事物的判斷可以抽象為分支結(jié)構(gòu),反復(fù)做的事情可以抽象為循環(huán)結(jié)構(gòu)等等。擁有較強(qiáng)計(jì)算思維能力的學(xué)生,具備更強(qiáng)大的解決問題的能力,當(dāng)在生活中遇到一些難以解決的問題時(shí),往往會(huì)想到借助計(jì)算機(jī)編寫程序的方式來(lái)找到問題的答案。本文中筆者以算法編程為背景,通過(guò)幾個(gè)編程案例,呈現(xiàn)了分析問題→思維轉(zhuǎn)換→程序?qū)崿F(xiàn)的過(guò)程,體會(huì)現(xiàn)實(shí)生活中的問題如何抽象并轉(zhuǎn)換成為能夠?yàn)橛?jì)算機(jī)理解的應(yīng)用程序的過(guò)程,進(jìn)而感受計(jì)算思維的魅力。
(作者單位:首都師范大學(xué)附屬育新學(xué)校)