111 司法特考三等 檢察事務官電子資訊組 程式語言 考古題詳解

111 年・司法特考・三等・檢察事務官電子資訊組
試題代碼 程式語言

第 一 題25 分

在 Backus-Naur Form(BNF)語法中,試說明剖析樹(Parse Tree),並使用以下語法,寫出語句 A:=B+C∗AA:=B+C*A 之兩種剖析樹。

⟨assign⟩→⟨id⟩:=⟨expr⟩⟨id⟩→A∣B∣C⟨expr⟩→⟨expr⟩+⟨expr⟩∣⟨expr⟩∗⟨expr⟩∣(⟨expr⟩)∣⟨id⟩\begin{aligned} \langle assign\rangle &\rightarrow \langle id\rangle := \langle expr\rangle \\ \langle id\rangle &\rightarrow A\mid B\mid C \\ \langle expr\rangle &\rightarrow \langle expr\rangle+\langle expr\rangle \\ &\quad\mid \langle expr\rangle*\langle expr\rangle \\ &\quad\mid(\langle expr\rangle) \\ &\quad\mid \langle id\rangle \end{aligned}

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

  1. 剖析樹(Parse Tree / Concrete Syntax Tree)之定義: 在形式語言與編譯器理論中,剖析樹是依據上下文無關文法(Context-Free Grammar, CFG / BNF)之產生規則(Production Rules),以樹狀階層結構視覺化呈現字串語法推導過程的圖形表示法。
  • 樹根節點(Root):文法的起始符號(Start Symbol),本題為 ⟨assign⟩\langle assign\rangle。
  • 內部節點(Internal Nodes):代表非終端符號(Non-terminal Symbols),如 ⟨assign⟩\langle assign\rangle、⟨id⟩\langle id\rangle、⟨expr⟩\langle expr\rangle。
  • 葉節點(Leaf Nodes):由左至右排列,代表終端符號(Terminal Symbols),包含變數名稱(A,B,CA, B, C)與運算子/標點符號(:=,+,∗:=, +, *),其由左至右的走訪結果即為輸入語句(稱為此樹的產出,Yield)。
  • 分支(Subtrees/Edges):代表某個產生規則的套用(例如父節點為 ⟨expr⟩\langle expr\rangle,子節點為 ⟨expr⟩\langle expr\rangle、++、⟨expr⟩\langle expr\rangle)。
  1. 文法之二義性(Ambiguity): 若一組 BNF 文法中,存在至少一個語句可以建構出兩棵或兩棵以上不同結構的剖析樹(或對應兩種不同的最左推導/最右推導),則稱該文法具有二義性(Ambiguous Grammar)。 題給文法未規範加法 ++ 與乘法 ∗* 的「運算子優先權(Precedence)」與「結合性(Associativity)」,故針對包含複合運算的語句 A:=B+C∗AA:=B+C*A 會產生歧義。

解題方法

本題解題切入點分為兩大部分:

  1. 說明剖析樹:條列定義、節點性質(樹根、內部節點、葉節點)以及剖析樹與產生規則推導之對應關係。
  2. 建構兩種剖析樹:
  • 觀察待剖析語句 A:=B+C∗AA:=B+C*A:
  • 最外層均必須先展開指派規則:⟨assign⟩→⟨id⟩:=⟨expr⟩\langle assign\rangle \rightarrow \langle id\rangle := \langle expr\rangle,左側 ⟨id⟩→A\langle id\rangle \rightarrow A。
  • 等號右側的運算式 ⟨expr⟩\langle expr\rangle 需導出 B+C∗AB+C*A。
  • 歧義來源在於右側運算式中「加法」與「乘法」的階層高低:
  • 剖析樹一(乘法優先,先乘後加):外層展開為 ⟨expr⟩+⟨expr⟩\langle expr\rangle + \langle expr\rangle,右側子樹再展開為 ⟨expr⟩∗⟨expr⟩\langle expr\rangle * \langle expr\rangle。此結構對應之語意為 A:=B+(C∗A)A := B + (C * A)。
  • 剖析樹二(加法優先,先加後乘):外層展開為 ⟨expr⟩∗⟨expr⟩\langle expr\rangle * \langle expr\rangle,左側子樹再展開為 ⟨expr⟩+⟨expr⟩\langle expr\rangle + \langle expr\rangle。此結構對應之語意為 A:=(B+C)∗AA := (B + C) * A。

選項分析

本題為申論與作圖題,無選擇題選項。此處針對本題文法二義性所衍生的兩種推導路徑進行語意結構對比分析:

  1. 路徑一(語意:B+(C∗A)B+(C*A)): 乘法節點 ∗* 處於剖析樹較深之子樹,加法節點 ++ 處於較淺之階層。
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 二 題25 分

請使用 C/C++、Java 或 Python 任一程式語言撰寫程式,將某陣列中的數字資料 5,3,8,6,7,25,3,8,6,7,2 以氣泡排序法由小而大排序。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

  1. 氣泡排序法(Bubble Sort)基本原理: 屬於比較排序法(Comparison Sort)。其核心機制為「相鄰元素兩兩比較」,若順序不符目標(如前項大於後項),則立即對調(Swap)。每一輪掃描(Pass)會將未排序區間中的最大值如同氣泡浮出水面般,逐步推進至該區間的最右端。
  2. 演算法複雜度與性質:
  • 時間複雜度:
  • 最差狀況(反序):O(n2)O(n^2)
  • 平均狀況:O(n2)O(n^2)
  • 最佳狀況(已排序且加入旗標最佳化):O(n)O(n)
  • 空間複雜度:O(1)O(1),屬於原地排序(In-place Sort),僅需常數個額外輔助變數。
  • 穩定性(Stability):屬於穩定排序(Stable Sort),因為兩相鄰元素若鍵值相等,則不進行對調,保有原本之相對順序。

解題方法

本題要求將包含 66 個元素之陣列 A=[5,3,8,6,7,2]A = [5, 3, 8, 6, 7, 2] 由小而大(遞增)排序。

  1. 演算法架構設計:
  • 外層迴圈(變數 ii):控制進行的回合數。長度為 nn 的陣列最多需執行 n−1n - 1 回合(ii 從 00 到 n−2n - 2)。
  • 內層迴圈(變數 jj):負責相鄰兩元素的比較與交換。由於每完成一個回合,該回合的最大值便已固定在陣列末端,故第 ii 回合只需比較至未排序區間邊界,即 jj 從 00 到 n−2−in - 2 - i。
  • 元素交換(Swap):以暫存變數 temp 進行三步驟數值交換。
  1. 追蹤推導過程(Trace Process): 初始狀態:[5,3,8,6,7,2][5, 3, 8, 6, 7, 2],長度 n=6n = 6。
  • 第 1 回合(Pass 1):比較範圍索引 0≤j≤40 \le j \le 4

  • j=0j=0:5>35 > 3 →\rightarrow 交換 →\rightarrow [3,5,8,6,7,2][3, 5, 8, 6, 7, 2]

  • j=1j=1:5≤85 \le 8 →\rightarrow 不換 →\rightarrow [3,5,8,6,7,2][3, 5, 8, 6, 7, 2]

  • j=2j=2:8>68 > 6 →\rightarrow 交換 →\rightarrow [3,5,6,8,7,2][3, 5, 6, 8, 7, 2]

  • j=3j=3:8>78 > 7 →\rightarrow 交換 →\rightarrow [3,5,6,7,8,2][3, 5, 6, 7, 8, 2]

  • j=4j=4:8>28 > 2 →\rightarrow 交換 →\rightarrow [3,5,6,7,2,8][3, 5, 6, 7, 2, 8]

  • 本回合完成,數值 88 已定位於索引 55。

  • 第 2 回合(Pass 2):比較範圍索引 0≤j≤30 \le j \le 3

  • j=0j=0:3≤53 \le 5 →\rightarrow 不換

  • j=1j=1:5≤65 \le 6 →\rightarrow 不換

  • j=2j=2:6≤76 \le 7 →\rightarrow 不換

  • j=3j=3:7>27 > 2 →\rightarrow 交換 →\rightarrow [3,5,6,2,7,8][3, 5, 6, 2, 7, 8]

  • 本回合完成,數值 77 已定位於索引 44。

  • 第 3 回合(Pass 3):比較範圍索引 0≤j≤20 \le j \le 2

  • j=0j=0:3≤53 \le 5 →\rightarrow 不換

  • j=1j=1:5≤65 \le 6 →\rightarrow 不換

  • j=2j=2:6>26 > 2 →\rightarrow 交換 →\rightarrow [3,5,2,6,7,8][3, 5, 2, 6, 7, 8]

  • 本回合完成,數值 66 已定位於索引 33。

  • 第 4 回合(Pass 4):比較範圍索引 0≤j≤10 \le j \le 1

  • j=0j=0:3≤53 \le 5 →\rightarrow 不換

  • j=1j=1:5>25 > 2 →\rightarrow 交換 →\rightarrow [3,2,5,6,7,8][3, 2, 5, 6, 7, 8]

  • 本回合完成,數值 55 已定位於索引 22。

  • 第 5 回合(Pass 5):比較範圍索引 0≤j≤00 \le j \le 0

  • j=0j=0:3>23 > 2 →\rightarrow 交換 →\rightarrow [2,3,5,6,7,8][2, 3, 5, 6, 7, 8]

  • 本回合完成,所有元素已全數就位。

最終排序結果為:[2,3,5,6,7,8][2, 3, 5, 6, 7, 8]。


選項分析

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 三 題25 分

若有一個遞迴函數如下:

Procedure FIB(n)if n=0, FIB=0;if n=1, FIB=1;else FIB(n−1)+FIB(n−2)end ifend\begin{aligned} \text{Procedure } FIB(n) \\ \quad\text{if } n=0,\ FIB=0; \\ \quad\text{if } n=1,\ FIB=1; \\ \quad\text{else } FIB(n-1)+FIB(n-2) \\ \quad\text{end if} \\ \text{end} \end{aligned}

試問 FIB(4)FIB(4) 之值為多少?在計算 FIB(4)FIB(4) 值時,需要呼叫此 FIB(n)FIB(n) 函數多少次。

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題考查遞迴演算法(Recursive Algorithm)之追蹤分析與函數呼叫次數(Function Invocations / Call Tree)之計算:

  1. 費氏數列(Fibonacci Sequence)定義: FIB(0)=0,FIB(1)=1,FIB(n)=FIB(n−1)+FIB(n−2)(n≥2)FIB(0) = 0,\quad FIB(1) = 1,\quad FIB(n) = FIB(n-1) + FIB(n-2) \quad (n \ge 2)
  2. 遞迴呼叫次數之遞迴關係式(Recurrence Relation): 計算 FIB(n)FIB(n) 時,若包含自身呼叫,其總呼叫次數 C(n)C(n) 滿足: C(0)=1,C(1)=1,C(n)=1+C(n−1)+C(n−2)(n≥2)C(0) = 1,\quad C(1) = 1,\quad C(n) = 1 + C(n-1) + C(n-2) \quad (n \ge 2)
  3. 遞迴呼叫樹(Recursion Tree):遞迴執行的軌跡可視為一棵樹狀結構,樹中的節點總數即為函數被呼叫的總次數。

解題方法

一、計算 FIB(4)FIB(4) 之值

依題意給定之定義,自底向上(Bottom-up)依序推導:

  • FIB(0)=0FIB(0) = 0
  • FIB(1)=1FIB(1) = 1
  • FIB(2)=FIB(1)+FIB(0)=1+0=1FIB(2) = FIB(1) + FIB(0) = 1 + 0 = 1
  • FIB(3)=FIB(2)+FIB(1)=1+1=2FIB(3) = FIB(2) + FIB(1) = 1 + 1 = 2
  • FIB(4)=FIB(3)+FIB(2)=2+1=3FIB(4) = FIB(3) + FIB(2) = 2 + 1 = 3

故 FIB(4)FIB(4) 之值為 33。


二、計算呼叫 FIB(n)FIB(n) 之次數

可透過「遞迴呼叫樹」或「遞迴關係式」兩種方式求解:

方法一:繪製遞迴呼叫樹(Recursion Tree)展開分析

將呼叫 FIB(4)FIB(4) 的展開過程表示為樹狀結構:

 FIB(4)
 / \
 FIB(3) FIB(2)
 / \ / \
 FIB(2) FIB(1) FIB(1) FIB(0)
 / \
 FIB(1) FIB(0)

統計樹中各層之呼叫次數:

  • 第 0 層(根節點):FIB(4)FIB(4),共 11 次。
  • 第 1 層:FIB(3),FIB(2)FIB(3), FIB(2),共 22 次。
  • 第 2 層:
  • 來自 FIB(3)FIB(3):FIB(2),FIB(1)FIB(2), FIB(1)
  • 來自 FIB(2)FIB(2):FIB(1),FIB(0)FIB(1), FIB(0)
  • 共 44 次。
  • 第 3 層:
  • 來自第 2 層之 FIB(2)FIB(2):FIB(1),FIB(0)FIB(1), FIB(0)
  • 共 22 次。

各函數呼叫次數明細:

  • 呼叫 FIB(4)FIB(4):11 次
  • 呼叫 FIB(3)FIB(3):11 次
  • 呼叫 FIB(2)FIB(2):22 次
  • 呼叫 FIB(1)FIB(1):33 次
  • 呼叫 FIB(0)FIB(0):22 次

總呼叫次數 =1+1+2+3+2=9= 1 + 1 + 2 + 3 + 2 = 9 次。

🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

第 四 題25 分

若有一個二維陣列宣告為 A[1..3,1..5]A[1..3,1..5],且已知其 A[1,1]A[1,1] 的位址為 100100,試以列為主及以行為主的表示法,求 A[2,4]A[2,4] 之位址為何?

登入後即可作答並保存紀錄。

這一題的完整詳解

核心觀念

本題測驗二維陣列(Two-Dimensional Array)於一維實體記憶體空間中的位址對映公式(Address Mapping Function)。常見的儲存順序有兩種:

  1. 以列為主(Row-Major Order):元素依列順序由左至右、由上而下連續存放(C、C++、Java 等語言採用)。
  2. 以行為主(Column-Major Order):元素依行順序由上而下、由左至右連續存放(Fortran、MATLAB 等語言採用)。

定址公式: 設二維陣列宣告為 A[L1..U1,L2..U2]A[L_1..U_1, L_2..U_2],其中:

  • 列數(Row count)R=U1−L1+1R = U_1 - L_1 + 1
  • 行數(Column count)C=U2−L2+1C = U_2 - L_2 + 1
  • 基準位址(Base Address)為 Loc(A[L1,L2])\text{Loc}(A[L_1, L_2])
  • 每個陣列元素佔用的記憶體大小為 dd(單位:Bytes 或 Words)

對於任意元素 A[i,j]A[i, j] 之位址公式:

  • 以列為主(Row-Major): Loc(A[i,j])=Loc(A[L1,L2])+[(i−L1)×C+(j−L2)]×d\text{Loc}(A[i, j]) = \text{Loc}(A[L_1, L_2]) + [(i - L_1) \times C + (j - L_2)] \times d
  • 以行為主(Column-Major): Loc(A[i,j])=Loc(A[L1,L2])+[(j−L2)×R+(i−L1)]×d\text{Loc}(A[i, j]) = \text{Loc}(A[L_1, L_2]) + [(j - L_2) \times R + (i - L_1)] \times d

解題方法

1. 整理題目已知條件

  • 陣列宣告:A[1..3,1..5]A[1..3, 1..5]
  • 第一維(列):下界 L1=1L_1 = 1,上界 U1=3U_1 = 3,總列數 R=3−1+1=3R = 3 - 1 + 1 = 3
  • 第二維(行):下界 L2=1L_2 = 1,上界 U2=5U_2 = 5,總行數 C=5−1+1=5C = 5 - 1 + 1 = 5
  • 起始位址:Loc(A[1,1])=100\text{Loc}(A[1, 1]) = 100
  • 目標元素:A[2,4]A[2, 4],即列索引 i=2i = 2、行索引 j=4j = 4
  • 題目未特別指定元素所佔空間大小,依國家考試慣例假設每個元素佔用 11 個記憶體單位(即 d=1d = 1)。

2. 以列為主(Row-Major Order)推導與計算

  • 推導步驟: 至目標元素 A[2,4]A[2, 4] 前,需先依序跨過:
  1. 完整的第 11 列(共跨過 i−L1=2−1=1i - L_1 = 2 - 1 = 1 列),每列有 C=5C = 5 個元素,共跨過 1×5=51 \times 5 = 5 個元素。
  2. 第 22 列中目標元素前方的元素(即 A[2,1],A[2,2],A[2,3]A[2, 1], A[2, 2], A[2, 3],共 j−L2=4−1=3j - L_2 = 4 - 1 = 3 個元素)。
  • 累積跨過的元素個數(Offset):
🔒

後續完整解題步驟與【答案】

免費註冊,享 3 天全站完整詳解閱覽。

免費註冊

其他考古題