Q10. 數學上定義一個複數 (Complex Number) 具有實數部分 + 虛數部分 * i,例如 5 + 4*i。以下請撰寫 ComplexNumber 類別的程式碼(含實部 realpart 與虛部 imagpart),包含簡單的四則運算、模長 magnitude()與共軛 conjugate()。
Ans:
Q10. 數學上定義一個複數 (Complex Number) 具有實數部分 + 虛數部分 * i,例如 5 + 4*i。以下請撰寫 ComplexNumber 類別的程式碼(含實部 realpart 與虛部 imagpart),包含簡單的四則運算、模長 magnitude()與共軛 conjugate()。
Ans:
Q9. 對於給定的表列 ( A ( B ( E ( K, L), F, W ), C ( G ), D ) ):
A) 畫出對應的多路樹 (multi-way tree);
B) 將多路樹轉換為二元樹 (binary tree),並畫出該二元樹。
Ans:
規則:
每個節點可以有多個子節點。
括號中的內容表示該節點的子節點。
根節點:A
A
的子節點:B
, C
, D
B
的子節點:E
, F
, W
E
的子節點:K
, L
C
的子節點:G
D
沒有子節點
A
/ | \
B C D
/ | \ \
E F W -
/ \
K L
|
-
說明:每個節點用直線連到它的子節點。
-
表示該節點沒有更多子節點。
轉換規則 (左子 + 右兄弟表示法 Left-child, Right-sibling)
每個節點的 第一個子節點 成為 左子節點 (left child)。
其他子節點依序成為 右兄弟 (right sibling)。
A
左子節點 → B
B
右兄弟 → C
,C
右兄弟 → D
B
的左子節點 → E
E
右兄弟 → F
,F
右兄弟 → W
E
的左子節點 → K
K
右兄弟 → L
C
的左子節點 → G
D
沒有子節點
A
/
B
/ \
E C
/ \ \
K F D
\ \
L W
/
G
為了更清楚,我整理成標準二元樹表示:
A
|
B
| \
E C
| \ \
K F D
\ \
L W
|
G
Q8. MyFibo 數列定義為 f₀ = 1, f₁ = 2, f₂ = 3, 且 fₖ = fₖ₋₁ + fₖ₋₂ + fₖ₋₃ (k ≥ 2)。請分別寫出該數列的遞迴與迭代演算法(以虛擬碼或 C/C#/Java 語法撰寫)。
Ans:
好的,我幫你整理 MyFibo 數列 的 遞迴 與 迭代 演算法。
定義:
f₀ = 1
f₁ = 2
f₂ = 3
fₖ = fₖ₋₁ + fₖ₋₂ + fₖ₋₃, for k ≥ 3
int MyFibo(int k) {
if (k == 0) return 1;
if (k == 1) return 2;
if (k == 2) return 3;
return MyFibo(k - 1) + MyFibo(k - 2) + MyFibo(k - 3);
}
int MyFiboIter(int k) {
if (k == 0) return 1;
if (k == 1) return 2;
if (k == 2) return 3;
int f0 = 1, f1 = 2, f2 = 3;
int f = 0;
for (int i = 3; i <= k; i++) {
f = f0 + f1 + f2;
// shift window
f0 = f1;
f1 = f2;
f2 = f;
}
return f;
}
👉 範例:計算前幾項
f₀ = 1
f₁ = 2
f₂ = 3
f₃ = 1 + 2 + 3 = 6
f₄ = 2 + 3 + 6 = 11
f₅ = 3 + 6 + 11 = 20
所以序列開頭是: 1, 2, 3, 6, 11, 20, …
&&
與 ||
的優先順序相同,且由左至右 (left-to-right)。這跟標準 C 稍微不同,標準 C 其實是 &&
比 ||
優先,但這裡規則是相同、且左結合。a && b || (c>d) || !(e>f) || a+b
先看結合方向:
(((a && b) || (c > d)) || !(e > f)) || (a + b)
這樣從左到右展開。
前序表示:
(a && b)
→ && a b
((a && b) || (c > d))
→ || (&& a b) (> c d)
(((a && b) || (c > d)) || !(e > f))
→ || (|| (&& a b) (> c d)) (! (> e f))
最後再和 (a + b)
→
|| (|| (|| (&& a b) (> c d)) (! (> e f))) (+ a b)
✅ 前序結果:
|| (|| (|| (&& a b) (> c d)) (! (> e f))) (+ a b)
!a && (b<c) || x
按左至右結合:
((!a && (b < c)) || x)
前序表示:
!a
→ ! a
(b < c)
→ < b c
(!a && (b < c))
→ && (! a) (< b c)
((!a && (b < c)) || x)
→ || (&& (! a) (< b c)) x
✅ 前序結果:
|| (&& (! a) (< b c)) x
※ 請供考生參考 / 營利必究 ※
Q6. 如下,請計算當 n = 5 時,第 6 行語句(r = r + 1;)會被執行多少次。
int mystery(n) {
int r = 0;
for (int i = 1; i <= n - 1; i++)
for (int j = i + 1; j <= n; j++)
for (int k = 1; k <= j; k++)
for (int m = 1; m <= k; m++)
r = r + 1;
return r;
}
Ans:
int mystery(n) {
int r = 0;
for (int i = 1; i <= n - 1; i++) // ①
for (int j = i + 1; j <= n; j++) // ②
for (int k = 1; k <= j; k++) // ③
for (int m = 1; m <= k; m++) // ④
r = r + 1; // ⑤ (我們要計算的次數)
return r;
}
最內層 (m 迴圈):
for (m = 1; m <= k; m++)
執行次數 = k
所以對於固定的 k
,⑤ 執行次數 = k
for (k = 1; k <= j; k++)
執行總次數 = 1 + 2 + 3 + ... + j = j(j+1)/2
所以對於固定的 j
,⑤ 執行次數 = j(j+1)/2
for (j = i+1; j <= n; j++)
所以對於固定的 i
,⑤ 執行次數 =
for (i = 1; i <= n-1; i++)
所以總次數 =
i=1∑n−1j=i+1∑n2j(j+1)我們要算:
i=1∑4j=i+1∑52j(j+1)
逐步計算:
i = 1 → j = 2..5
22⋅3+23⋅4+24⋅5+25⋅6=3+6+10+15=34i = 2 → j = 3..5
6+10+15=31i = 3 → j = 4..5
10+15=25i = 4 → j = 5
1534+31+25+15=105
✅ 答案:當 n = 5 時,語句 r = r + 1;
會執行 105 次。
Q5. 對下列網際網路應用,請分別指出其採用 TCP 或 UDP 的傳輸層協定:
A) 電子郵件 (E-mail)
B) 檔案傳輸 (FTP)
C) 視訊會議 (video conference)
D) 網頁搜尋 (web searching, 如 Google)
E) 線上遊戲 (online games)
F) VoIP (voice on internet)
TCP (Transmission Control Protocol)
面向連線 (connection-oriented)。
提供可靠性、錯誤檢查、資料順序控制。
適合需要「正確性」的應用(如檔案、文字)。
UDP (User Datagram Protocol)
無連線 (connectionless)。
傳輸快速、延遲低,但不保證可靠性。
因為對於與時間順序有關的應用,在超過需求時間後再重傳沒有意義。(這點最重要)
適合即時應用(如影音串流、遊戲)。
A) 電子郵件 (E-mail) → TCP
使用 SMTP、POP3、IMAP,都需要可靠傳輸。
B) 檔案傳輸 (FTP) → TCP
FTP 需完整、正確的檔案傳輸,不能遺失資料。
C) 視訊會議 (Video Conference) → UDP
即時性比完整性重要,少量遺失可容忍。
D) 網頁搜尋 (Web Searching, 如 Google) → TCP
使用 HTTP/HTTPS (底層是 TCP),需完整正確的資料。
E) 線上遊戲 (Online Games) → UDP
要求低延遲,能容忍部分封包遺失。
F) VoIP (Voice over IP) → UDP
語音通訊強調即時性,延遲比正確性更重要。
Q4 傳遞參數方式主要包含:傳值呼叫 (call-by-value)、傳址呼叫 (call-by-address)、傳參照呼叫 (call-by-reference)、傳名呼叫 (call-by-name)。請解釋這些方式在被呼叫副程式(callee subroutine)與呼叫者(caller)之間的資料傳遞差異,以及副程式結束後實際參數是否會受到影響。
當呼叫者 (caller) 將參數傳入被呼叫副程式 (callee subroutine) 時,不同的傳遞方式會影響 副程式內部對參數的操作方式,以及 呼叫結束後實際參數是否會改變。以下逐一說明:
機制:呼叫時,會將 實際參數的值複製一份 傳給副程式。
影響:副程式僅能操作這份「複本」,不會影響原始的實際參數。
結果:副程式結束後,實際參數不變。
範例:C 語言傳遞基本型別。
機制:呼叫時,會將 實際參數的記憶體位址 (指標) 傳入副程式。
影響:副程式若透過該位址修改內容,會直接作用於呼叫者的實際參數。
結果:副程式結束後,實際參數可能改變。
範例:C 語言以指標 (int *p
) 參數傳遞。
機制:呼叫時,傳入的是 實際參數的參照 (reference),就像是替呼叫者的變數取了一個「別名」。
影響:副程式內對參數的修改,會直接反映在呼叫者的實際參數上。
結果:副程式結束後,實際參數可能改變。
範例:C++ 的參照 (int &x
),或 Java 的物件傳遞(嚴格來說是「值傳遞參照」)。
機制:呼叫時,傳入的不是值或位址,而是 一段可以重新計算的表達式。副程式每次使用該參數時,會「回頭」以文字替換或延遲計算的方式來求值。
影響:效果類似巨集展開,每次取用都會重新計算,可能導致副作用。
結果:實際參數是否改變,取決於該表達式的內容與副程式操作方式。
範例:ALGOL 語言、Scala(透過 =>
call-by-name 參數)。
Q3 請說明物件導向程式設計 (OOP) 中的封裝 (encapsulation)、多型 (polymorphism) 以及多載 (overloading) 的特徵。
定義:
將資料 (屬性) 與操作這些資料的方法 (函式) 打包成一個物件,並透過存取修飾子 (如 private
, public
, protected
) 來控制外部存取。
特徵:
隱藏內部細節,只暴露必要的介面 (interface)。
提高程式的 安全性(避免外部直接修改內部資料)。
增加 模組化與可維護性。
範例 (Java):
class BankAccount {
private double balance; // 封裝在物件內,不可直接存取
public void deposit(double amount) {
balance += amount;
}
public double getBalance() {
return balance;
}
}
定義:
「相同的方法呼叫,依物件型態不同而有不同行為」。
特徵:
方法覆寫 (Overriding):子類別重新定義父類別的方法。
執行時期 (runtime) 會根據物件的實際型態決定呼叫哪個方法。
提升 程式彈性 與 可擴充性。
範例 (Java):
class Animal {
void speak() { System.out.println("Some sound"); }
}
class Dog extends Animal {
@Override
void speak() { System.out.println("Woof!"); }
}
class Cat extends Animal {
@Override
void speak() { System.out.println("Meow!"); }
}
// 多型展現
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.speak(); // Woof!
a2.speak(); // Meow!
定義:
在同一個類別中,方法名稱相同,但參數型態或數量不同。
特徵:
屬於 編譯時期多型 (compile-time polymorphism)。
不需要繼承關係。
讓方法更直覺,根據輸入型態自動選擇正確版本。
範例 (Java):
class MathUtil {
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
}
MathUtil m = new MathUtil();
System.out.println(m.add(3, 5)); // 呼叫 int 版本
System.out.println(m.add(2.5, 4.3)); // 呼叫 double 版本
System.out.println(m.add(1, 2, 3)); // 呼叫三參數版本
Q2. 請詳述下列名詞的主要差異:資料庫 (database)、資料倉儲 (data warehouse)、資料探勘 (data mining)、資料結構 (data structure)、大數據 (big data)。
定義:
資料的集中存放與管理系統,用來 儲存、查詢、修改與維護日常營運資料。
特點:
強調 即時性(例如銀行交易、醫院病歷)。
使用 資料庫管理系統 (DBMS) 如 MySQL、PostgreSQL、Oracle。
資料通常是結構化的(表格形式)。
應用情境:需要儲存大量資料的系統,例如,:差假系統、電子商務、醫院資訊系統。
定義:
專門為 分析與決策 設計的大型資料庫,會將不同來源的資料整合後,進行清理、轉換,再集中儲存。
特點:
偏重 歷史資料(不是即時交易)。
經過 ETL 流程(Extract, Transform, Load)整理過。
適合 報表分析、商業智慧 (BI)、趨勢預測。
應用情境:銷售趨勢分析、財務報表彙整、企業決策支持系統。
定義:
在大量資料中,透過演算法 發現隱藏的模式與知識 的過程。
特點:
結合 統計學、機器學習與人工智慧 技術。
著重在 找出規律、預測未來。
屬於資料分析的一部分。
應用情境:信用卡詐欺偵測、客戶行為分析、推薦系統(如 Netflix、蝦皮推薦)。
定義:
程式設計中 組織與儲存資料的方法,確保資料存取與運算更有效率。
特點:
屬於 電腦科學的基本概念。
常見種類:陣列 (Array)、鏈結串列 (Linked List)、堆疊 (Stack)、佇列 (Queue)、樹 (Tree)、圖 (Graph)、雜湊表 (Hash Table)。
應用情境:演算法設計、程式效率優化、搜尋與排序。
定義:
指 龐大且多樣化的資料集合,傳統資料庫系統無法有效處理,需要特殊技術(如分散式計算)。
特點:常以 5V 描述:
Volume(大量)
Velocity(高速產生)
Variety(多樣型態:文字、影像、影音、感測器資料)
Veracity(真實性、可靠性)
Value(價值萃取)
應用情境:社群媒體分析、IoT 物聯網資料處理、醫療大數據、智慧城市。
Q1: 請解釋組譯器 (assembler)、直譯器 (interpreter) 與編譯器 (compiler) 之間的差異與應用情境。
定位:介於「組合語言」與「機器碼」之間的工具。
功能:將 組合語言 (Assembly) 逐條指令轉換成對應的 機器碼。
特點:
一對一翻譯,組譯後的執行速度最快。
與硬體架構密切相關(同一段組合語言在不同 CPU 架構可能不通用)。
使用情境:
嵌入式系統(例如控制器、感測器)。
驅動程式開發(直接控制硬體)。
效能要求極高或需要直接操作硬體暫存器的場合。
定位:將「高階語言」轉換成「可執行程式」。
功能:將整份 高階語言程式碼(如 C、C++、Rust)一次性翻譯成 機器碼或中間碼 (bytecode)。
特點:
一次性翻譯,生成執行檔。
執行效率高(因為已經是機器碼)。
缺點是 編譯過程較慢,開發過程需要等待編譯完成。
使用情境:
系統軟體(如作業系統核心)。
效能要求高的應用程式(C/C++/Rust)。
跨平台應用(Java 透過編譯成 bytecode,交由 JVM 執行)。
定位:直接執行程式碼的「解釋器」。
功能:逐行讀取、翻譯並 立即執行程式碼。
特點:
跨平台性強,不需事先編譯。
除錯方便,適合快速開發與測試。
缺點是 執行速度較慢(每次執行都要重新解譯)。
使用情境:
腳本語言:Python、JavaScript、Ruby。
互動式開發環境 (REPL)。
快速原型設計或 教育學習場合。