為孩子寫一本編程書系列:學(xué)習(xí)函數(shù) 將命令打包
在上一節(jié)中,小Ian已經(jīng)熟悉了使用命令來解決一些簡單的編程挑戰(zhàn)。雖然只是在Playground中將moveFoward()、collectGem()、toggleSwitch()這些簡單的命令進行組合并執(zhí)行,但看得出,在每一次完成一項編程挑戰(zhàn)游戲的過程中,孩子的編程思維也正被逐漸地構(gòu)建起來。而在這一節(jié)里,我們將介紹編程學(xué)習(xí)中另一個重要工具——函數(shù)。
認識函數(shù)
在我們的日常生活中,即使是一個最簡單的任務(wù),也是由由一系列步驟,按照一定的順序組合而成的。比如,我們每天都會做的系鞋帶這個動作,也可以將它分成三個步驟來完成。
每雙鞋都有兩只,因此同樣的過程,我們需要重復(fù)執(zhí)行兩遍。想象一下,如果我們用上一節(jié)學(xué)過的命令方式,去讓計算機完成系鞋帶這個任務(wù)的話,是不是應(yīng)該需要輸入下面這6條命令呢?
但想一想,當(dāng)我們穿鞋時,其實并不是按照這些指令來完成穿鞋這個任務(wù)的。在我們的腦子里只是記住了系鞋帶的步驟,然后每次需要穿鞋系鞋帶時,就將這些步驟從腦袋里拿出來,應(yīng)用到穿每一只鞋子上。那么,同樣的,有沒有一種方法能夠讓計算機記住這些步驟,并在需要的時候去使用它呢?這里,我們就需要用到一個新的工具——函數(shù)。
函數(shù)能夠?qū)⒁唤M命令打包,并給它賦予一個名稱。而這一組命令便可以在需要時通過這個函數(shù)的名字進行調(diào)用。
定義函數(shù)
讓我們?nèi)砸韵敌瑤槔纯慈绾瓮ㄟ^定義函解的方式,讓計算機記住系鞋帶的步驟:
- 首先我們通過 func 關(guān)鍵字來聲明一個函數(shù)
- func后面跟著的便是我們給函數(shù)起的名字,上面這個函數(shù)的名字叫做tieMyShoe——系我的鞋帶,和之前提到的命令一樣,我們也在函數(shù)的名稱后面加上一對括號。
- 我們使用一對 花括號{} 來定義函數(shù)所包含的內(nèi)容,我們也稱它為 函數(shù)體。通過將命令添加到函數(shù)體中,便能給這個函數(shù)添加我們所希望的行為。
調(diào)用函數(shù)
我們定義函數(shù)之后,計算機并不會自動地去執(zhí)行它。而是需要我們明確地告訴計算機在何時何地去調(diào)用它。我們通過函數(shù)名來調(diào)用并執(zhí)行它所打包的那一組命令。這里,我們便通過調(diào)用兩次tieMyShoe()函數(shù),完成給兩只鞋系鞋帶的任務(wù)。
Tips:理解函數(shù)的定義和調(diào)用之間的關(guān)系非常重要,函數(shù)用來打包命令,但在定義后并不會被直接執(zhí)行,只有在通過函數(shù)的名字調(diào)用它們時,函數(shù)體內(nèi)的命令才會被執(zhí)行。
通過函數(shù)簡化問題解決
函數(shù)是程序員們編程時最常使用的工具,但對于初學(xué)者來說,他們卻往往難以判斷什么時候應(yīng)該使用函數(shù),因為,大部分情況下我們同樣能通過組合命令來解決問題。下面是那些最常見的函數(shù)使用場景,而其中第二點又是這些場景中最常見的:
- 當(dāng)需要通過組合已有的命令,來創(chuàng)造出新的或更復(fù)雜的行為時
- 當(dāng)某一行為可能被重復(fù)或多次使用時
- 當(dāng)某一行為變得太過復(fù)雜時,也會將它分解成多個更小的行為
下面還是讓我們回到Ian最喜歡的Playground中,去看看我們?nèi)绾瓮ㄟ^函數(shù)去解決那些復(fù)雜問題。在這個挑戰(zhàn)游戲中,我們需要幫助Byte抓到全部4顆寶石,并打開4個開關(guān)。
Ian一眼就看出了這個迷宮的規(guī)律,4個寶石和4個開關(guān),平均分布在迷宮的4條邊上。每一條邊上的寶石和開關(guān)都在相同的位置上。因此,我們只要定義一個函數(shù)去解決一條邊上的寶石和開關(guān),然后重復(fù)調(diào)用四次便可以完成這個編程挑戰(zhàn)了。讓我們?yōu)檫@個函數(shù)起個名字,就叫它resolveRow()吧。
瞧,我們剛剛成功完成了這個編程挑戰(zhàn),比起我們光用命令去實現(xiàn)所需要的27條命令,使用函數(shù)的方式是不是簡明了很多呢?上面的這個編程挑戰(zhàn),并不是Playground中函數(shù)這一小節(jié)的***個編程挑戰(zhàn),但我們在這個挑戰(zhàn)游戲中所運用的方法,卻像極了那些程序員們在日常工作中,解決問題時所普遍采用的思路:
- 首先明確任務(wù)的目標:抓到所有寶石、打開所有開關(guān)
- 分析問題,盡可能地通過識別模式,將較大的問題分解為一個個小問題:這里的小問題就是解決一條邊上的寶石與開關(guān)。
- 為每一個獨立的小問題找到解決方法:通過定義函數(shù)resolveRow()來處理一條邊上的寶石與開關(guān)。
- 通過將這些小問題的解決組合起來,解決整個任務(wù)所包含的大問題:通過調(diào)用4次resolveRow()函數(shù),完成挑戰(zhàn)。
Tips:這種解決問題的思路和方法,不僅在編程中普遍應(yīng)用,也同樣適用于幾乎所有學(xué)科和領(lǐng)域。孩子們在學(xué)習(xí)編程的過程中,實際也是在學(xué)習(xí)問題識別、分解和解決的方法,這對他們盡早培養(yǎng)起獨立解決問題的能力非常有幫助
小節(jié)
通過這一節(jié)的學(xué)習(xí),我們認識了編程中的函數(shù),通過定義函數(shù),我們用一個名字來指代一組命令所包含的行為。并在需要時,通過對這個函數(shù)名的調(diào)用,告訴計算機去執(zhí)行這一組命令。另外,我們還學(xué)習(xí)了如何將大問題進行分解,并通過定義和調(diào)用函數(shù)來解決問題的方法,這一方法將始終貫穿于我們?nèi)蘸蟮木幊虒嵺`當(dāng)中。在下一節(jié),我們將會學(xué)習(xí)編程中的一個重要控制邏輯For循環(huán)。
練習(xí)
請大家完成Playground中,F(xiàn)uncations這一節(jié)中的其他編程挑戰(zhàn),它們包括:定義一個新的函數(shù);在函數(shù)中添加命令以創(chuàng)建新的行為;函數(shù)間的嵌套調(diào)用;通過函數(shù)解決復(fù)雜問題等等。完成這些練習(xí)后,你將會對函數(shù)的使用有更深入的理解,這也將是你未來構(gòu)建更強大應(yīng)用的基礎(chǔ)。
【本文是51CTO專欄作者“陳逸鶴”的原創(chuàng)文章,如需轉(zhuǎn)載請聯(lián)系作者本人(微信公眾號:techmask】