歡迎來到演算法設計的世界!
你有沒有想過電腦是怎樣「思考」的?其實它並沒有像我們一樣的大腦,它只是遵循一套非常具體的指令,我們稱之為演算法(Algorithm)。你可以把演算法想像成一份食譜:如果你嚴格按照步驟操作,就能做出美味的蛋糕;但如果漏掉一個步驟,情況可能就會一團糟!
在這個章節中,我們不僅僅是在學習編寫程式,我們還在學習如何設計解決方案。我們將會探討每一位程式設計師都必須掌握的常見「食譜」,並學習如何將困難的大問題拆解成簡單的小問題。如果剛開始覺得有點複雜,別擔心——看完這些筆記,你就會開始像專業程式設計師一樣思考了!
1. 建立你的邏輯:核心演算法
在 Python 中,有像 min() 或 sum() 這樣的內建捷徑。然而,要成為一名出色的電腦科學家,你需要了解這些功能在「底層」是如何運作的。讓我們看看如何從零開始建構它們吧!
A. 尋找最大值(Maximum)或最小值(Minimum)
類比:想像你手邊有一疊寫著數字的卡片,共 100 張。你一次只能看一張卡片。你要怎麼找出最大的一張?你可能會把目前為止見過最大的那張拿在左手,然後用右手拿取新卡片來進行比較。
步驟解析:
1. 選取列表中的第一項,將其命名為 current_max(當前最大值)。
2. 逐一瀏覽列表中的其餘項目。
3. 對於每個項目,詢問:「這個項目比我的 current_max 大嗎?」
4. 如果是,則將 current_max 更新為這個新項目。
5. 如果否,則直接跳到下一個項目。
6. 當你到達列表末端時,你的 current_max 就是贏家!
常見錯誤:如果你的列表可能包含負數,千萬不要將 current_max 的初始值設為 0!從列表的第一項開始設定總是比較安全的。
B. 計算總和與平均值
「累加(Running Total)」技巧:要計算總和,想像你有一個存錢筒。每當你在列表中看到一個數字,就把那個金額投進存錢筒裡。
公式:
要計算平均值,你可以使用這個簡單的數學式:\( Average = \frac{Total Sum}{Number of Items} \)
快速回顧:若要在沒有捷徑的情況下取得項目數量(Number of Items),你可以建立一個初始值為 0 的「計數器(counter)」變數,每看過一個項目就加 1。
C. 搜尋項目
線性搜尋(Linear Search):這就像在長長的隊伍中尋找某個特定的朋友。你從隊伍最前面開始,問每個人:「你是 Charlie 嗎?」,直到找到他為止,或是走到隊伍最後面。
邏輯:使用迴圈來檢查每一個項目。如果你找到了匹配的對象,就記錄它的位置(索引,index)並停止。如果你走到最後仍沒找到,就可以告知使用者該項目不存在。
D. 根據準則提取項目
有時候你只需要特定的項目——例如「所有大於 50 的數字」或「所有以 A 開頭的名字」。
邏輯:建立一個新的空列表。透過迴圈瀏覽原始列表,對每個項目檢查它是否符合你的準則(criteria)。如果符合,就將其「附加(append)」到你的新列表中。
E. 手動分割字串
想像你有一個句子:"I-love-computing",你想要在每次看到連字號(-)時將單字分開。
邏輯:建立一個空的「字串變數」和一個空的列表。查看每一個字元。如果該字元不是連字號,就將它加到你的「字串變數」中。如果它是連字號,這代表單字結束了!將「字串變數」加入到你的列表中,並將「字串變數」重設為空值。
本節總結:大多數基礎演算法都遵循一種模式:初始化(Initialize)變數(例如最大值或總和)、迴圈(Loop)處理資料,並根據條件更新(Update)變數。
2. 處理大問題的聰明策略
當你面對複雜的專案時,不要試圖一次寫完所有程式碼。請使用這四種專業策略:
A. 模組化方法(分解 Decomposition)
類比:想想樂高積木。你不會把整座城堡當作一塊巨大的磚塊來蓋,你會分別組裝塔樓、城牆和大門,然後再將它們組合在一起。在計算機科學中,我們將程式拆分成小小的模組(modules)或函式(functions)。
為什麼要這樣做?修復一個壞掉的塔樓比修復整個壞掉的城堡要容易得多!
B. 增量方法(Incremental Approach)
概念:從程式最簡單的版本開始,確保它完美運行。然後,一次慢慢增加一個新功能。
範例:如果你要製作一個計算機,先從製作「加法」開始。一旦運作正常,再加入減法。千萬不要試圖同時完成加、減、乘、除!
C. 先手動解決
你知道嗎?你應該經常離開電腦,動手解決問題!如果你無法在紙上用鉛筆解決問題的小型版本,你就無法告訴電腦該如何處理。
訣竅:親手解決 3 到 4 個小範例。觀察你採取的通用步驟,這些步驟就會成為你的演算法!
D. 模式識別(Pattern Recognition)
策略:問問自己:「我以前看過類似的東西嗎?」
如果你知道如何找出列表中的最大值,你就已經知道如何找出最小值了(只要把「大於」符號換成「小於」即可)。如果你會搜尋數字,你就能搜尋字串。別重複發明輪子!
3. 快速回顧與小撇步
必須記住的關鍵術語:
演算法(Algorithm):一系列逐步操作的指令。
準則(Criteria):用於篩選特定資料的規則或條件。
分隔符(Delimiter):用於分隔字串中項目的字元(例如逗號或空格)。
迭代(Iteration):迴圈或重複步驟的另一種說法。
記憶口訣:「I.L.U.」
大多數演算法都遵循 I.L.U.:
1. Initialize(初始化):先設定好你的變數。
2. Loop(迴圈):遍歷資料。
3. Update(更新):必要時更改你的變數。
最後的鼓勵:演算法設計是一種技能,就像演奏樂器或運動一樣。你練習這些任務的「手動」版本越多,感覺就會越自然。你一定沒問題的!