B1.1 計算思維
計算思維(Computational thinking)是用電腦科學家的方式分析與解決問題的思考方法,包含分解、模式辨識、抽象化與演算法設計四個核心元素。本頁說明這四個元素,以及如何用流程圖與虛擬碼表達演算法、如何用追蹤表檢查演算法是否正確。
計算思維有哪四個元素?
| 元素 | 英文 | 意義 | 例子:規劃畢業旅行 |
|---|---|---|---|
| 分解 | Decomposition | 把大問題拆成小問題 | 拆成交通、住宿、行程、預算 |
| 模式辨識 | Pattern recognition | 找出相似之處,重複利用解法 | 每天行程都是「早上景點、中午用餐、下午活動」 |
| 抽象化 | Abstraction | 保留重要細節,忽略不相關細節 | 地鐵圖只畫站與路線,不畫街道 |
| 演算法設計 | Algorithmic design | 寫出明確、有限、按順序執行的步驟 | 訂票步驟:比價 → 選日期 → 付款 → 確認 |
演算法(algorithm) 是解決問題的明確步驟,必須:有明確的輸入與輸出、每一步沒有歧義、在有限步驟內結束。
如何用流程圖表示演算法?
流程圖(flowchart)用標準符號表示步驟:橢圓為開始/結束、平行四邊形為輸入/輸出、長方形為處理、菱形為判斷。
flowchart TD
A([開始]) --> B[/輸入分數 score/]
B --> C{score >= 4 ?}
C -- 是 --> D[/輸出 及格/]
C -- 否 --> E[/輸出 不及格/]
D --> F([結束])
E --> F
如何寫虛擬碼?
虛擬碼(pseudocode)是不拘泥於特定語言語法、但結構清楚的演算法描述。以下找出串列中的最大值:
max ← numbers[0]
loop i from 1 to length(numbers) - 1
if numbers[i] > max then
max ← numbers[i]
end if
end loop
output max
如何用追蹤表檢查演算法?
追蹤表(trace table)逐步記錄每個變數的值,用來找出邏輯錯誤或預測輸出。以 numbers = [3, 8, 2, 9] 執行上面的虛擬碼:
| i | numbers[i] | numbers[i] > max? | max |
|---|---|---|---|
| — | — | — | 3 |
| 1 | 8 | 是 | 8 |
| 2 | 2 | 否 | 8 |
| 3 | 9 | 是 | 9 |
輸出為 9。Paper 2 經常要求完成追蹤表,務必一列一列寫,不要跳步。
還有哪些重要的思考方式?
- 預先思考(thinking ahead):先想清楚輸入、輸出、前置條件(precondition),例如二元搜尋要求資料已排序。
- 程序化思考(thinking procedurally):把解法組織成子程序(函式),每個子程序負責一件事。
- 邏輯思考(thinking logically):找出決策點與條件,確認每一種情況都有處理。
- 並行思考(thinking concurrently):找出可以同時進行的工作,例如下載多個檔案。
推薦影音
什麼是計算思維?
簡述:GCSE 等級的清楚入門,用生活例子介紹分解、模式辨識、抽象化與演算法,觀念與 IB B1.1 一致。
演算法入門
簡述:Crash Course 介紹什麼是演算法、如何比較演算法效率,並以排序與圖的最短路徑為例,可銜接 B2.4。
練習題
練習 1:分解
把「設計一個學校圖書館借書系統」分解成至少四個子問題。
參考答案
(1) 會員管理:註冊、登入;(2) 書籍管理:新增、搜尋、狀態;(3) 借還書:借出、歸還、到期日計算;(4) 逾期通知與罰款;(5) 報表:熱門書籍統計。
練習 2:抽象化
為一個「校園導航 App」做抽象化:哪些資訊要保留、哪些可以忽略?
參考答案
保留:建築物與教室位置、走道連接關係、距離、無障礙通道。忽略:牆壁顏色、樹木位置、建築外觀細節。
練習 3:追蹤表
完成下列虛擬碼的追蹤表,並寫出輸出。
參考答案
| n | n mod 2 = 0? | total |
|---|---|---|
| — | — | 0 |
| 1 | 否 | 0 |
| 2 | 是 | 2 |
| 3 | 否 | 2 |
| 4 | 是 | 6 |
輸出 6(1 到 4 之間偶數的總和)。