歡迎來到計算的世界!
你好!今天,我們要深入探討計算機科學中最令人興奮的部分之一:算法設計與問題解決 (Algorithm Design and Problem-solving)。你可以把這一章想像成蓋房子的「建築設計階段」。在程式設計師用 Python 或 VB.NET 寫下第一行程式碼之前,他們必須先有一個紮實的計劃,而那個計劃就是你的算法。別擔心,如果剛開始覺得這些概念有點抽象——我們將會透過你每天都能見到的事物,一步步為你拆解!
9.1 計算思維技能 (Computational Thinking Skills)
計算思維不僅僅是為了電腦而存在的;它是一種看待問題的方式,透過將問題拆解,讓人類或機器能夠順利解決。在你的工具箱中,最重要的兩個工具是抽象化 (Abstraction) 和 分解 (Decomposition)。
抽象化:綜觀全局
抽象化是過濾掉不必要細節的過程,讓你能夠專注於真正重要的部分。
現實生活中的類比:想像一張倫敦地鐵圖。它不會顯示每一條街道或軌道的精確彎曲弧度,它只顯示車站和連接路線。這就是抽象化——它去除了「雜訊」,讓你更容易找到路。
在計算機科學中,我們運用抽象化來建立系統模型。透過只關注必要細節,我們能讓複雜的問題變得更容易管理。
分解:化繁為簡
分解是指將一個龐大、複雜的問題拆解成較小、易於處理的子問題。
現實生活中的類比:如果有人叫你「籌辦一個音樂節」,你可能會感到恐慌!但如果你把它分解為:
1. 尋找場地
2. 邀請樂團
3. 售賣門票
4. 安排保安
突然間,這件事就變得可行了!在程式設計中,我們將主要任務分解為更小的模組 (modules)(例如程序 Procedures 和函數 Functions)。
快速複習:
抽象化:隱藏不重要的細節。
分解:將大問題拆解成小零件。
9.2 算法 (Algorithms)
算法其實就是解決問題的方法,它以一系列明確的步驟來表示。無論是烘焙蛋糕的食譜,還是組裝椅子的說明書,這些都是算法!
標識符 (Identifiers) 的重要性
在設計算法時,我們使用名稱來代表資料(例如變數和常數),這些名稱稱為標識符。
實用小貼士:請務必使用具意義的名稱!與其將變數命名為 \(x\),不如叫它 \(TotalScore\)。這能讓你的算法對他人來說更容易理解。
在 9618 考試中,你通常需要使用標識符列表 (Identifier Table)。這是一個簡單的表格,列出:
標識符名稱:變數的名稱。
資料類型:它儲存哪種類型的資料(例如 INTEGER、STRING)。
說明:簡要解釋它的用途。
記錄你的算法
在開始寫程式碼之前,有三種主要的方法可以展示你的算法:
1. 結構化英語 (Structured English):這是以邏輯、逐步方式編寫的平實英語。它比程式碼不那麼正式,但比一般對話更有條理。
2. 流程圖 (Flowcharts):利用特定圖形(如菱形代表決策,矩形代表處理過程)來顯示算法流程的視覺化圖表。
3. 虛擬碼 (Pseudocode):這是算法設計中的「黃金標準」。它看起來像程式碼,但不受限於任何特定語言的語法。它易於閱讀,且之後很容易轉換成真實的程式碼。
你知道嗎?
「Algorithm」這個詞來自 9 世紀波斯數學家花拉子米 (Al-Khwarizmi) 的名字!人類進行計算思維的歷史已經超過一千年了。
三個基本建構區塊
世界上每一個算法,無論多麼複雜(甚至是運行 YouTube 或 TikTok 的那些算法!),都是由三個基本建構區塊組成的:
1. 順序 (Sequence)
這是最簡單的結構,意味著電腦按照書寫的精確順序,一個接一個地執行指令。
範例:
1. 起床
2. 刷牙
3. 吃早餐
2. 選擇 (Selection)
這是指算法根據條件做出選擇的地方。我們通常會使用 IF 語句或 CASE 語句來達成。
範例:
IF 正在下雨 THEN
帶雨傘
ELSE
戴太陽眼鏡
ENDIF
3. 迭代 (Iteration) / 重複 (Repetition)
這意味著重複執行一組指令。你需要知道三種類型:
計數控制 (Count-controlled):重複特定的次數(例如 FOR 迴圈)。
前置條件 (Pre-condition):在執行迴圈之前檢查條件(例如 WHILE 迴圈)。
後置條件 (Post-condition):執行一次迴圈後,再檢查條件(例如 REPEAT...UNTIL 迴圈)。
重點總結:
順序 = 順序
選擇 = 決策
迭代 = 迴圈
逐步求精 (Stepwise Refinement)
有時候,即使經過分解,一個子問題仍然太大而無法直接寫成程式碼。逐步求精就是將這些子問題進一步拆解成更小、更具體步驟的過程。
把它想像成相機的「變焦」功能。你從模糊的概覽開始,不斷地進行精細化,直到每一個細節都清晰到足以編寫成程式碼為止。
範例:
第一層級:「泡一杯茶」
第二層級:「燒開水」、「放茶包」、「加水」
第三層級:「注水進水壺」、「開啟水壺」、「等待水滾」...
當步驟簡單到可以直接寫成一行程式碼時,你就可以停止求精了。
要避免的常見錯誤
1. 無窮迴圈 (Infinite Loops):忘記在 WHILE 迴圈中更新變數。如果條件永遠不會變為 false,電腦就會永遠跑下去!
2. 模糊的標識符:避免使用 \(a\)、\(b\) 和 \(c\) 這類名稱。這會讓除錯變成一場惡夢。
3. 忽略輸入/輸出:算法通常需要資料才能開始 (Input),也需要顯示結果 (Output)。別忘了在虛擬碼中加入 INPUT 和 OUTPUT 指令!
總結複習
抽象化幫助我們忽略雜訊。
分解幫助我們管理複雜度。
算法是成功的逐步食譜。
順序、選擇和迭代是建立任何邏輯所需的三大工具。
逐步求精確保我們有足夠的細節來實際開始撰寫程式碼。
如果覺得這些內容很多,別擔心!問題解決是一種隨著練習而進步的技能。你畫和寫的算法越多,這種思維方式就會變得越「自然」。你一定做得到的!