原標題:這兩道題,曾經像一道光照亮了我,給了我最重要的底層能力
最近我們在寫關於編程思維的文章。編程思維是邏輯學、數學和計算機科學的結晶,背後其實是一系列的核心思維方法。
在上週的文章《刷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圈”這個動作裏,就包含了很多分解動作,比如每匹馬每轉一圈都得“上去-下來-上去-下來-上去-下來”,那麼,我們就可以把這一組動作,打包成一個函數,取名叫“旋轉一圈”。以後每次碰到這組動作,就直接調用“旋轉一圈”這個函數,而不用再把“上去-下來-上去-下來-上去-下來”的動作寫一遍了。
其實,循環和函數是無處不在的,在我們的身體裏也有內置的循環和函數。
如果我們可以進入自己身體裏的呼吸運行系統,就會發現兩個函數:吸入函數和呼出函數。
你看,從“橫膈肌收縮”到“氧氣進入血液”,每一次吸氣,我們的身體都要進行這一系列的動作,我們就可以把這一系列動作打包成一個函數,取名叫“吸氣”。事實上,你可以試試,當你的大腦給身體下指令吸氣的時候,都是在調用函數“吸氣”,而不用一步步的告訴身體需要做什麼。
所以,如果給我們複雜的呼吸系統寫一個程序,善於發現和整合規律的程序員,只要三行代碼就夠了。
循環無數次
吸氣(吸入函數)
呼氣(呼出函數)
在編程過程中你會發現,發現和整合規律,是孩子需要不斷去練習的思維方法。
好了,懂了“分解、分類、效率第一、發現和整合規律”,孩子就已經具備了最核心的編程思維了,也能理解最基礎的一些編程概念,像順序結構(“分解”做一件事的步驟)、條件語句(“分類”不同的情況)、循環語句、函數等等。
這些核心思維方法,孩子將來不論做什麼工作,都能從中受益,也足以讓孩子成為一個合格的程序員。
但是,這些都是建立在我們已經知道了要讓程序去做什麼、怎麼做,已經對一個問題有了解決方案的基礎上。
如果,我根本不知道解決方案是什麼怎麼辦呢?比如説,我要讓一個程序找出太空中某一種特定的天體(這就是妞爸在做的事),我到底要讓這個程序做些什麼呢?什麼樣的思維方法可以幫助到我?
這就是下一篇文章我想和大家討論的了。最後,別忘了咱們的思考題哦~
謝謝你關注帝呱呱星球,這裏有傳説中的海淀、順義媽媽。因為地域和工作的原因,我們得以接觸優質的教育資源和先進的育兒理念,希望和你分享雞娃時代裏不一樣的育兒新認知、帝都新生活。