楠木軒

這兩道題,曾經像一道光照亮了我,給了我最重要的底層能力

由 高會雲 發佈於 科技

原標題:這兩道題,曾經像一道光照亮了我,給了我最重要的底層能力

最近我們在寫關於編程思維的文章。編程思維是邏輯學、數學和計算機科學的結晶,背後其實是一系列的核心思維方法。

在上週的文章《刷100道奧數題,不如學會這道邏輯題和它的思考方法,這才是數學和編程的通關密碼》裏,我們解析了其中的兩個:分解和分類。用上這兩種思維方法,基本上就能讓一個程序不出錯的跑起來了,算是編程裏的基礎思維。

那麼,怎麼能讓一個程序運行起來更高效,編寫起來也更簡潔?這就得用上另外兩個思維方法了:效率第一、發現並整合規律。

一、效率第一

先來説效率第一。

咱們一起來開動一下腦筋。

如果我們要讓2個機器人把這些灰塵掃進簸箕裏,要分幾步?

很多人下意識的做法是3步:

有沒有更好的步驟?

其實,把流程優化一下,2步就夠了。

這是編程思維的一個重要原則:效率第一。時刻想着怎麼樣對流程進行優化,讓程序的步驟最少、用時最短、效率最高。

再來試試這個任務吧。

在高鐵上,要取下每排座位上的枕巾,同時把座位轉一個方向。

你很有可能會這麼做:先把枕巾一條條取下來,再旋轉座位。這是最順其自然的想法。

用這種方法,因為最裏邊靠近車窗的枕巾手臂是夠不着的,這就需要你移動身體,走到座位的最裏邊,再退出來。

把它拆解成分解步驟的話,一共需要6步。

這樣沒問題,能完成任務,但步驟有點多,而且要在座位的間隙裏擠來擠去,也挺麻煩。有沒有更有效率的方法呢?

調整一下流程呢?先取下手臂能夠拿到的兩條枕巾,接着旋轉座位,靠近車窗的那條枕巾就旋轉到手邊了,這樣的話,你不需要移動身體,就能輕鬆取下所有枕巾。

分解一下步驟,這樣做只需要4步:

這其實就是“統籌安排”。

統籌安排我一直覺得是數學裏對我影響最大的方法。

還記得當年那2道題嗎:

燒開水要8分鐘,掃地5分鐘,抹桌子2分鐘,做完3件事最短一共要幾分鐘?

一個平底鍋每次能煎2個煎餅,一個煎餅有兩面,每面要煎2分鐘。煎3個煎餅,最少要用幾分鐘?

這2道題曾經像一束光一樣點亮了我,讓我恍然大悟,原來應該這樣思考問題、安排工作。它是我習得的最重要的底層能力之一。

其實改變孩子的,給孩子底層能力的,可能就是某一道照亮孩子的光。

當然,有時候要達到高效,還需要一點創造性的方法。

給大家留個思考題。

用一個帶輪子的鏟子,把散落在地上的這些狗狗糞便收集起來。

但是有一個條件,這個鏟子轉向的時候很慢很麻煩,所以要儘量走直線,減少轉彎的次數。

你會怎麼做呢?是這樣嗎?

一共轉了兩次彎。

其實,只要轉向一次就能做到了。

你想出辦法了嗎?記得到留言裏來告訴我哦~想知道答案的話,就關注我們,進入公號發送“思考題”獲取吧。

二、發現並整合規律

咱們再假設一下,有個機器人站在離你5步遠的地方,你要讓它向你走過來。

你可能會這樣下指令:

向我走1步

向我走1步

向我走1步

向我走1步

向我走1步

打字打得手都酸了,而且一不小心還會寫錯,寫成“向我走11步”。

更簡單的方法,當然是這樣下指令:

重複5次

向我走1步

這就是發現程序中的重複規律,並且進行整合,也就是算法中的“循環結構”。

如果是要設計一個旋轉木馬的程序呢?

首先你要為它設計一個運行模式:旋轉3圈,休息10秒;旋轉3圈,休息10秒……如此循環。

那麼“旋轉3圈,休息10秒”就是一個重複規律。這個程序可以這樣寫:

重複無數次

旋轉1圈

旋轉1圈

旋轉1圈

休息10秒

接着,你會進一步發現,“旋轉1圈”也是一個重複單元。程序又可以進一步簡化:

重複無數次

重複3次

旋轉1圈

休息10秒

除了循環結構,編程中的“函數”,也需要發現並整合重複規律的能力。

“函數”是編程裏的一個概念,和數學裏的函數不一樣。它是什麼呢?

簡單來説,編程裏的“函數”就是程序裏會多次出現的一組動作,我把這組動作打個包,取個名字,每一次碰到這個動作的時候,就把這個動作包調出來用就行了。

有一些編程語言裏會帶有很多已經寫好的、可供使用的內置函數,程序員只要拿來用就可以了,不需要再自己編寫,這也是一個語言好不好用的重要原因之一。

但更多時候需要我們自己去打包函數。

比如上面這個旋轉木馬程序的例子。

木馬“旋轉1圈”這個動作裏,就包含了很多分解動作,比如每匹馬每轉一圈都得“上去-下來-上去-下來-上去-下來”,那麼,我們就可以把這一組動作,打包成一個函數,取名叫“旋轉一圈”。以後每次碰到這組動作,就直接調用“旋轉一圈”這個函數,而不用再把“上去-下來-上去-下來-上去-下來”的動作寫一遍了。

其實,循環和函數是無處不在的,在我們的身體裏也有內置的循環和函數。

如果我們可以進入自己身體裏的呼吸運行系統,就會發現兩個函數:吸入函數和呼出函數。

你看,從“橫膈肌收縮”到“氧氣進入血液”,每一次吸氣,我們的身體都要進行這一系列的動作,我們就可以把這一系列動作打包成一個函數,取名叫“吸氣”。事實上,你可以試試,當你的大腦給身體下指令吸氣的時候,都是在調用函數“吸氣”,而不用一步步的告訴身體需要做什麼。

所以,如果給我們複雜的呼吸系統寫一個程序,善於發現和整合規律的程序員,只要三行代碼就夠了。

循環無數次

吸氣(吸入函數)

呼氣(呼出函數)

在編程過程中你會發現,發現和整合規律,是孩子需要不斷去練習的思維方法。

好了,懂了“分解、分類、效率第一、發現和整合規律”,孩子就已經具備了最核心的編程思維了,也能理解最基礎的一些編程概念,像順序結構(“分解”做一件事的步驟)、條件語句(“分類”不同的情況)、循環語句、函數等等。

這些核心思維方法,孩子將來不論做什麼工作,都能從中受益,也足以讓孩子成為一個合格的程序員。

但是,這些都是建立在我們已經知道了要讓程序去做什麼、怎麼做,已經對一個問題有了解決方案的基礎上。

如果,我根本不知道解決方案是什麼怎麼辦呢?比如説,我要讓一個程序找出太空中某一種特定的天體(這就是妞爸在做的事),我到底要讓這個程序做些什麼呢?什麼樣的思維方法可以幫助到我?

這就是下一篇文章我想和大家討論的了。最後,別忘了咱們的思考題哦~

謝謝你關注帝呱呱星球,這裏有傳説中的海淀、順義媽媽。因為地域和工作的原因,我們得以接觸優質的教育資源和先進的育兒理念,希望和你分享雞娃時代裏不一樣的育兒新認知、帝都新生活。