歡迎來到演算法的世界!
你好!這一章是計算機科學的核心。你可能會覺得演算法是複雜的程式碼,但它們其實只是為了解決問題而設計的絕妙計畫。如果你懂得跟著食譜做菜,你就一定能理解演算法!
在本節中,我們將學習如何適當地規劃和建構電腦解決問題所需的步驟。這項技能對於程式設計中的問題解決(Problem Solving)以及其他領域至關重要。
如果剛開始覺得有點複雜,別擔心。我們會將每個概念拆解成簡單且易於掌握的步驟。
1. 定義演算法:電腦的食譜
演算法究竟是什麼?
演算法簡而言之,就是一套定義明確、按步驟進行的指令,用於解決特定問題或完成任務。
如果能正確遵循這些步驟,演算法必須始終產生正確的結果,並且最終必須停止。
優質演算法的關鍵特徵:
- 清晰(Clear): 每個步驟都必須明確,沒有歧義(不會造成混淆)。
- 有限(Finite): 它必須在有限的步驟後結束。它不能無止境地運行!
- 有效(Effective): 每項指令都必須簡單到足以被執行。
輸入-處理-輸出 (IPO) 模型
每個程式和演算法都遵循一個稱為 IPO 模型的基本結構:
輸入 (INPUT) → 處理 (PROCESS) → 輸出 (OUTPUT)
類比:泡一杯茶
- 輸入: 水、茶包、牛奶、糖。(你開始時所需的原始數據/材料)。
- 處理: 燒開水、浸泡茶包、加入牛奶/糖。(演算法/步驟)。
- 輸出: 一杯完美的熱茶。(結果/解決方案)。
在計算機科學中,輸入可能是使用者鍵入的數字,處理可能是將該數字與另一個數字相加,而輸出則是顯示出來的結果。
快速複習:演算法定義
演算法是解決問題的一系列有限且明確的步驟。它遵循 IPO 模型。
2. 建構模組:控制結構
為了控制指令的流程,所有演算法都使用三種基本結構。你可以將這些視為編寫任何程式時所擁有的三種主要工具。
A. 順序 (Sequence)(按順序執行)
順序是最基本的結構。指令會從上到下,一個接一個地執行。
- 先執行步驟 1,然後是步驟 2,接著是步驟 3,以此類推。
- 範例: 準備上學。
1. 起床。
2. 刷牙。
3. 穿上校服。
B. 選擇 (Selection)(做出抉擇)
選擇(或稱決策)允許演算法根據條件是否成立(True 或 False),在兩條或多條路徑之間進行選擇。這通常使用 IF... THEN... ELSE 邏輯。
類比:交通燈決策
如果燈號是綠色(條件為真):則 (THEN) 開車。
否則 (ELSE)(如果燈號不是綠色,即紅色或黃色):則 (THEN) 停車。
關鍵點: 選擇意味著只有一條路徑會被執行。
常見的選擇結構:
- IF... THEN...(只有在條件為真時才採取行動)
- IF... THEN... ELSE(條件為真時採取一個行動,條件為假時採取另一個行動)
- 巢狀選擇 (Nested Selection)(將一個 IF 語句放在另一個 IF 語句中,用於處理複雜的決策)
C. 疊代 (Iteration)(重複動作)
疊代(也稱為重複 (Repetition) 或 迴圈 (Looping))是指重複執行一組指令,直到滿足特定條件為止。
當我們需要多次執行相同的任務時,就會使用疊代,例如檢查長列表中的每個名字。
你需要知道兩種主要的迴圈類型:
1. 固定疊代 (FOR 迴圈)
當你確切知道迴圈需要執行多少次時使用。
範例: FOR 執行 10 次,舉起槓鈴。
2. 條件控制疊代 (WHILE 迴圈)
當重複次數未知時使用。迴圈會持續進行,WHILE (當) 條件保持為真。
範例: WHILE 密碼錯誤,請持續要求使用者重試。
給學生的提醒: 使用 WHILE 迴圈時要小心!如果條件永遠不會變為假,演算法就會無休止地運行。這稱為無限迴圈 (Infinite Loop)——這是程式設計中常見的錯誤!
記憶小撇步:3S 與 1I
演算法依賴於:
1. Sequence (順序)
2. Selection (選擇)
3. Iteration (疊代)
3. 表達演算法
在編寫程式碼之前,你需要先規劃演算法。我們使用兩種主要工具來視覺化或編寫計畫:
A. 流程圖 (Flowcharts)(視覺化規劃)
流程圖使用符號和線條來一步步展示邏輯流程。它們非常適合用來宏觀地理解程式,特別是用於識別決策(選擇)和迴圈(疊代)。
你必須掌握的關鍵流程圖符號:
| 符號 | 名稱/形狀 | 代表意義 |
|---|---|---|
| 橢圓或圓角矩形 | 終止符 (Terminator) | 演算法的開始 (START) 或結束 (END) 點。 |
| 矩形 | 處理 (Process) | 資料被處理或進行計算的步驟(例如:相加兩個數字)。 |
| 平行四邊形 | 輸入/輸出 (I/O) | 演算法獲取使用者輸入或顯示輸出的步驟。 |
| 菱形 | 決策 (Decision) | 測試條件的點(例如:IF X > 10)。它有一個入口和兩個出口(是/否 或 真/假)。 |
| 箭頭 | 流程線 (Flow Line) | 顯示演算法的執行方向。 |
B. 偽代碼 (Pseudocode)(結構化英語)
偽代碼是一種使用結構化英語編寫演算法步驟的方法。它不是一種程式語言,但它使用常見的關鍵字(如 IF、WHILE、FOR、READ、PRINT)使結構清晰。
這對於日後將你的計畫輕鬆轉換為任何程式語言非常有用。
偽代碼片段範例:
READ Score
IF Score >= 50 THEN
PRINT "及格"
ELSE
PRINT "不及格"
ENDIF
你知道嗎?
"Algorithm"(演算法)一詞源自於波斯數學家花拉子米(Muhammad ibn Musa al-Khwarizmi),他生活在公元 820 年左右。他為世界引入了代數和系統化的計算方法!
4. 常見的問題解決演算法
在解決問題時,電腦通常需要管理大量的資料。其中兩項最常見的任務是尋找資料和排序資料。
A. 搜尋演算法
搜尋演算法是一種用於在資料集合中尋找特定項目的方法。
1. 線性搜尋 (Linear Search)(或稱序列搜尋)
這是最簡單的搜尋方法。演算法會從頭到尾檢查列表中的每一項,直到找到目標項目或到達列表末尾為止。
- 何時使用: 在小型列表,或未排序的列表上使用。
- 限制: 如果列表非常巨大,效率會非常低,因為它可能需要檢查每一項。
2. 二元搜尋 (Binary Search)
這是一種速度更快、效率更高的搜尋方法,但它有一個關鍵前提:
在執行二元搜尋之前,資料列表必須經過排序。
類比:猜書中的頁數
如果你要在字典(已排序)中尋找一個單詞,你不會從第 1 頁開始翻。你會先翻到大概中間的位置。
如果你要找的單詞在中間頁面之*前*,你就可以忽略後半部分的書。如果它在之*後*,你就可以忽略前半部分。
二元搜尋的運作方式是:
- 找到列表中的中間項。
- 將目標項目與中間項進行比較。
- 如果兩者不符,演算法會立即排除掉剩餘資料中的一半。
- 重複此過程,直到找到項目為止。
對於大型且已排序的資料集,二元搜尋比線性搜尋快得多。
B. 排序演算法
排序演算法是一種用於將資料元素按特定順序(例如:數字或字母,升序或降序)排列的方法。
為什麼我們需要排序?
我們排序資料是為了讓搜尋變得更輕鬆、更快速(如二元搜尋所示),並能清晰地呈現資訊(例如:按名次排列的學生分數)。
概念範例:氣泡排序 (Bubble Sort)(簡化版)
氣泡排序是最簡單的排序方法之一。它會反覆遍歷列表,比較相鄰的元素,如果它們順序錯誤就將其交換。它之所以被稱為「氣泡」排序,是因為較小、較輕的元素會像氣泡一樣慢慢「浮」到列表頂端。
雖然它非常容易理解,但與其他排序演算法相比,它在處理大型列表時效率並不高。
關鍵總結:效率
選擇演算法時,效率很重要!
二元搜尋效率高(速度快),但需要資料已排序。
線性搜尋效率低(對於大型列表來說很慢),但適用於未排序的資料。
你已經成功掌握了規劃運算問題的基礎!現在你知道如何使用順序、選擇和重複來指導電腦了。做得好!