***

👋 歡迎來到單元 4:計算思維 (Computational Thinking, CT)!

各位未來的電腦科學家好!如果覺得這個單元聽起來很複雜,別擔心——這其實是整門課最有趣的部分。計算思維 (Computational Thinking, CT) 是所有電腦科學的基石。它指的並不是編寫程式碼,而是學習如何像電腦一樣,高效、清晰且合乎邏輯地解決問題。

你可以把 CT 想成是你的 CS 超能力——這是一套工具箱,無論是規劃讀書進度還是設計下一個熱門應用程式,你都可以用它來處理各種難題。掌握了這些技巧,你會發現課程的其餘部分,尤其是程式設計,將會變得容易理解得多!

學習目標: 在本章結束時,你將會理解計算思維的四個核心要素,以及它們如何幫助你設計出有效的演算法。

***

1. 什麼是計算思維?

計算思維 (CT) 是一個解決問題的過程,包含了一系列心智工具與技術,幫助我們建構問題,並以人類或電腦都能有效執行的方式表達出解決方案。

解決問題的過程

CT 的核心環繞著四項基礎技術,通常我們使用縮寫 D.P.A.A. 來記憶:

  • Decomposition(分解)
  • Pattern Recognition(模式識別)
  • Abstraction(抽象化)
  • Algorithm Design(演算法設計與評估)

你知道嗎? CT 是一種早在現代電腦出現之前就存在的技能!數學家和邏輯學家幾個世紀以來一直在使用這些技術。

***

2. 計算思維的四大支柱

2.1. 分解 (Decomposition)

這是什麼?

分解是指將複雜的問題或系統拆解成更小、更易於管理的子問題。這是應對任何大型任務的第一步。

類比:拼裝 LEGO 城堡

如果你要拼一座巨大的 LEGO 城堡,你不會把整盒積木倒出來然後隨機拼湊。相反地,你會這樣分解任務:

  1. 搭建地基/基礎結構。
  2. 搭建塔樓 A。
  3. 搭建主城門。
  4. 組裝屋頂部分。
  5. 將所有部分連接起來。

每個子問題(例如搭建一座塔樓)都比原先複雜的任務(建造整座城堡)要容易解決得多。

分解的好處:
  • 降低複雜度,讓任務看起來沒那麼令人畏懼。
  • 允許不同的人(或團隊)同時處理不同的子問題(這在大型軟體開發專案中至關重要)。
  • 讓識別錯誤(除錯/Debugging)變得容易許多。

快速回顧: 分解將一個巨大的頭痛難題變成了幾個小型、可解決的拼圖。

2.2. 模式識別 (Pattern Recognition)

這是什麼?

模式識別涉及在分解後的小問題中,尋找相似之處、趨勢或共通特徵。

類比:準備晚餐

如果你要為派對準備幾道菜,你可能會注意到一些模式:

  • 清洗蔬菜是三種不同沙拉都需要的前置步驟。
  • 切洋蔥是湯和燉菜都需要做的。

透過識別這些重複的模式,你就不必每次都發明一個新的解決方案(或編寫一個新的函式)。你可以使用相同的技術(或編寫同一個程式碼模組)來解決多個相似的子問題。

模式識別的好處:
  • 透過重複使用有效的解決方案,節省時間與心力。
  • 編寫出更簡潔、優雅的程式碼(減少重複)。
  • 有助於預測與分析(如果我們知道問題過去的表現模式,它未來很可能也會以同樣方式運作)。

重點: 如果你發現了模式,你就只需要解決那一部分一次!

2.3. 抽象化 (Abstraction)

這是什麼?

抽象化可以說是計算思維中最重要,但也往往最具挑戰性的一環。它的意思是專注於必要的資訊,同時過濾掉不相關的細節。

它能幫助我們建立一個模型 (Model),或是問題的簡化表示。

類比:城市地圖

當你在手機上使用地圖時,你看不到每棟房子的確切顏色、路邊樹木的種類,或是是否有車輛違規停放。為什麼呢?因為這些細節對於你的目標(找出最快的路線)而言是無關的

  • 必要細節: 道路名稱、路口、行駛方向。
  • 不相關細節(被過濾掉): 建築物顏色、天氣、個別的街道告示牌。

在電腦科學中,解決問題時,我們必須識別出核心變數與處理程序(必要細節),並忽略任何對解決方案沒有直接影響的事物。

避免常見誤區:

學生有時會將「抽象化」與「分解」混淆。

  • 分解是將問題的物理規模拆分(劃分任務)。
  • 抽象化是減少問題的資訊複雜度(忽略細節)。

快速回顧: 抽象化是為了找出真正重要的部分,從而建立一個實用且簡化的模型

2.4. 演算法設計 (Algorithm Design)

這是什麼?

在分解問題、識別模式並抽象出必要資訊後,最後一步就是設計一套解決問題的指令集。這套指令集就是演算法 (Algorithm)

演算法是一組有限的、無歧義的、逐步執行的指令,遵循這些指令即可解決特定類型的問題。

優秀演算法的特徵:
  1. 輸入 (Input): 必須接受零個或多個定義明確的輸入。
  2. 輸出 (Output): 必須產生一個或多個定義明確的輸出。
  3. 無歧義 (Unambiguous): 每個步驟必須清晰且精確(例如:寫「將兩個數字相加」,而不是「隨便混在一起」)。
  4. 有限性 (Finite): 必須在執行有限步驟後終止(結束)。
  5. 有效性 (Effective): 每一個指令必須足夠簡單,能被可靠地執行。
表示演算法的方式

我們使用精確但不綁定特定程式語言的結構來表達演算法:

  • 偽代碼 (Pseudocode): 類似程式碼的結構化文字(例如:IF 條件 THEN 動作)。
  • 流程圖 (Flowcharts): 使用標準化符號的圖表(平行四邊形表示輸入/輸出,矩形表示程序,菱形表示決策)。

重點: 演算法設計是將之前所有思考步驟 (D.P.A.A.) 轉化為實踐的過程。

***

3. 評估解決方案(實際的解決問題)

一旦設計出演算法並可能已實作為程式碼,計算思維的過程並沒有結束。我們必須評估該解決方案是否有效。

3.1. 正確性與測試

最基本的評估是解決方案是否正確運作。

  • 驗證 (Validation): 解決方案是否符合使用者的需求?
  • 確認 (Verification): 解決方案是否依照規格正確地建構?

我們使用測試計畫 (Test plans) 來系統性地檢查解決方案,包括邊界情況 (Boundary cases) 和異常數據,以確保演算法足夠穩健。

3.2. 效率(時間與空間)

正確的演算法不一定就是好的演算法。我們還必須考慮它的效率——即它如何有效使用資源。

時間效率(時間複雜度 Time Complexity)

這衡量的是當輸入數據量增加時,演算法的執行時間如何成長。我們通常使用大 O 符號 (Big O Notation) 來討論(稍後你會深入學習)。

一個非常高效的演算法(如簡單搜尋)可能是 \(O(1)\) 或 \(O(\log n)\),這意味著即使數據量 (n) 非常龐大,所需時間幾乎不會增加。而效率較低的演算法(如複雜的排序程序)則可能是 \(O(n^2)\) 或更糟。

空間效率(空間複雜度 Space Complexity)

這衡量的是演算法執行時需要多少暫存記憶體(空間)。在現代計算中,空間作為限制因素的情況雖然不如時間頻繁,但仍是至關重要的考量,特別是對於資源有限的設備(如微控制器或行動裝置)。

重點: 我們基於兩個準則來評估解決方案:它們是否正確(能運作嗎?),以及它們是否有效率(運作迅速且不會浪費資源嗎?)。

***

📘 快速回顧:計算思維工具箱

計算思維 (CT) 是一種嚴謹的解決問題方法。每次處理複雜任務時,請務必使用 D.P.A.A. 框架!

支柱 行動 目的與類比
分解 將複雜問題拆解成較小部分。 使問題易於管理(就像規劃一場大型長假)。
模式識別 識別共同主題、相似點與可重複使用的解決方案。 透過重複使用方法來節省工作(就像發現多個方程式使用同一個公式)。
抽象化 專注於必要細節並忽略不相關的「噪音」。 建立一個簡化、相關的模型(就像閱讀地鐵路線圖)。
演算法設計 開發逐步執行的指令。 提供具體、無歧義的解決方案(就像詳細的食譜)。


持續練習這些步驟,你會發現計算思維將成為你的本能,這不僅能幫助你的電腦科學學習,還能應用到你所有的科目中!

***