歡迎來到抽象化與自動化世界!

在本章中,我們將探討計算機科學中「思維」的一面。你有沒有想過,程式設計師是如何將現實世界中龐大且混亂的問題,轉化為簡潔優雅的程式碼?這並非魔法——這就是抽象化 (Abstraction)自動化 (Automation) 的力量。我們將學習如何剔除問題中的「雜訊」以找到核心邏輯,並將該邏輯轉化為可運行的程式。如果這些術語聽起來有點「科幻」,別擔心;我們會一步步為你拆解!


1. 解決問題與使用演算法

在編寫程式碼之前,我們必須先解決問題的邏輯。邏輯問題 (Logic problem) 就像一個謎題,你需要運用事實和規則來找出答案。一旦找到解決方案,你就可以將其轉化為演算法 (Algorithm)

什麼是演算法?

演算法簡而言之就是為了完成一項任務而遵循的一系列步驟。至關重要的是,一個真正的演算法必須始終終止 (must always terminate)(它必須在某個時間點結束!)。

比喻:想像一下烤蛋糕的食譜。它有特定的順序、清晰的指令,當蛋糕出爐後,整個流程就結束了。

編寫演算法

在考試中,你經常會用到偽代碼 (Pseudo-code)。這是一種編寫指令的方式,它看起來像程式碼,但對人類來說更容易閱讀。你只需要掌握四個主要的構建模組:

  • 順序 (Sequence):將指令按正確的順序排列。
  • 賦值 (Assignment):為變數賦予一個值(例如:\( x = 5 \))。
  • 選擇 (Selection):使用 IF 語句進行決策。
  • 迭代 (Iteration):使用 FORWHILE 迴圈重複執行步驟。

快速複習:為了檢查演算法是否有效,我們使用手動追蹤 (Hand-trace)。這意味著你要模擬電腦,在紙上逐一執行步驟時,記下每個變數的值。

常見錯誤:忘記演算法必須終止。如果你的迴圈無窮無盡,那麼它就不是一個有效的演算法!


2. 抽象化的力量

抽象化是簡化事物的過程。在計算機科學中,我們用它來管理複雜性。你需要了解幾種特定的類型:

表徵抽象化 (Representational Abstraction)

這是指通過刪除不必要的細節來創建事物的模型。你只需保留對解決問題絕對必要的資訊即可。

例子:倫敦地鐵圖。它不會顯示軌道的確切曲線或地面上的樹木;它只顯示車站和路線,因為這就是乘客唯一需要知道的資訊。

泛化抽象化 (Abstraction by Generalisation / Categorisation)

這涉及根據共同特徵對事物進行分組,從而建立層次關係。我們稱之為「是一種 (is a kind of)」關係。

例子:「黃金獵犬」是一種「狗」,而「狗」是一種「動物」。通過將它們分組,我們可以一次性解決所有「狗」的問題,而無需糾結於具體的品種。

資訊隱藏 (Information Hiding)

這是隱藏物件中所有對其核心特性無貢獻的細節的過程。它確保程式設計師不會因為「底層」如何運作而分心。

核心要點:抽象化就是一種過濾 (filtering)。如果你正在開發飛行模擬器,你需要了解物理和風向,但你不需要知道乘客穿的襪子是什麼顏色!


3. 抽象化的層次(「如何做」與「做什麼」)

計算機科學家使用不同「層次」的抽象化來處理不同的任務。

程序抽象化 (Procedural Abstraction)

這代表了一種計算方法。當我們進行程序抽象化時,我們是在將具體的數值「抽象化」。我們創建一個程序 (procedure),該程序可以用不同的資料來獲取結果。

函數抽象化 (Functional Abstraction)

這更進一步。程序抽象化的結果是一個函數 (function)。在這裡,具體的計算方法被隱藏了。你知道輸入什麼(input)以及輸出什麼(output),但你不需要知道函數內部是如何進行計算的。

資料抽象化 (Data Abstraction)

這隱藏了資料實際的表示方式。它允許我們從基本的資料類型中創建新型的資料物件。

例子:你可能會使用一個資料「堆疊 (Stack)」。對你來說,它只是一堆東西,你可以將其中一個「推入 (push)」到最上面。在底層,電腦可能使用陣列 (array)指標 (pointer) 來追蹤頂部,但你無需看到這些細節即可使用堆疊。

你知道嗎?資料抽象化就像使用電視遙控器。你知道按下「音量調高」會讓聲音變大,但你不需要了解發送給電視處理器的電子訊號是如何運作的。


4. 分解、合成與歸約

當問題變得太大時,我們使用這三種技術使其易於管理。

分解 (Decomposition)

這意味著將一個問題拆解為較小的子問題。每個子問題都應該完成一個可識別的任務。然後,你可以進一步拆解這些子問題!

合成 (Composition)

這與分解相反:將程序或資料物件組合起來以構建更複雜的系統。例如,你可以組合多個小函數來創建完整的銀行應用程式,或組合資料物件來創建「樹狀」資料結構。

問題抽象化(歸約, Reduction)

這是解決問題時的「啊哈!」時刻。你刪除細節,直到問題簡化為一個已經被解決過的版本。

鼓勵一下:如果剛開始覺得很難,別擔心!只要記住:分解 = 拆開合成 = 組合在一起


5. 自動化:讓模型變為現實

自動化是最後一步。它是將我們的抽象模型投入實際應用以解決現實世界問題的過程。我們通過以下步驟實現自動化:

  1. 創建演算法:設計邏輯。
  2. 實作程式碼:編寫指令(「如何做」)。
  3. 實作資料結構:選擇如何儲存資料。
  4. 執行程式碼:運行程式以獲得結果。

總結:計算機科學的核心在於為「混亂的」現實世界現象建立簡潔的模型。我們決定保留什麼以及捨棄什麼(抽象化),以準確適度地解決問題。

考試重點摘要:

  • 演算法:一系列始終終止的步驟。
  • 表徵抽象化:刪除不必要的細節
  • 泛化:按共同特徵分組(「是一種」關係)。
  • 分解:將問題拆分為更小的任務
  • 自動化:通過程式碼將模型付諸行動