歡迎來到演算法的世界!

你好!這一章是計算機科學的核心。你可能會覺得演算法是複雜的程式碼,但它們其實只是為了解決問題而設計的絕妙計畫。如果你懂得跟著食譜做菜,你就一定能理解演算法!

在本節中,我們將學習如何適當地規劃和建構電腦解決問題所需的步驟。這項技能對於程式設計中的問題解決(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 頁開始翻。你會先翻到大概中間的位置。

如果你要找的單詞在中間頁面之*前*,你就可以忽略後半部分的書。如果它在之*後*,你就可以忽略前半部分。

二元搜尋的運作方式是:

  1. 找到列表中的中間項。
  2. 將目標項目與中間項進行比較。
  3. 如果兩者不符,演算法會立即排除掉剩餘資料中的一半
  4. 重複此過程,直到找到項目為止。

對於大型且已排序的資料集,二元搜尋比線性搜尋快得多。

B. 排序演算法

排序演算法是一種用於將資料元素按特定順序(例如:數字或字母,升序或降序)排列的方法。

為什麼我們需要排序?

我們排序資料是為了讓搜尋變得更輕鬆、更快速(如二元搜尋所示),並能清晰地呈現資訊(例如:按名次排列的學生分數)。

概念範例:氣泡排序 (Bubble Sort)(簡化版)

氣泡排序是最簡單的排序方法之一。它會反覆遍歷列表,比較相鄰的元素,如果它們順序錯誤就將其交換。它之所以被稱為「氣泡」排序,是因為較小、較輕的元素會像氣泡一樣慢慢「浮」到列表頂端。

雖然它非常容易理解,但與其他排序演算法相比,它在處理大型列表時效率並不高。

關鍵總結:效率

選擇演算法時,效率很重要!
二元搜尋效率高(速度快),但需要資料已排序。
線性搜尋效率低(對於大型列表來說很慢),但適用於未排序的資料。


你已經成功掌握了規劃運算問題的基礎!現在你知道如何使用順序、選擇和重複來指導電腦了。做得好!