程式設計基礎(虛擬碼追蹤)

÷ 為除法,代入整數型變數(含引數)時捨去小數部分。下列程式在以遞增順序排好的整數型陣列 data(元素編號從1開始)中,把第一個大於或等於 x 的值的元素編號求到 lo。x 不大於 data 的最後一個元素。程式中的【a】應填入下列何者?

整數型: lo ← 1, hi ← data的元素數, mid
while (lo < hi)
  mid ← (lo + hi) ÷ 2
  if (data[mid] < x)
    lo ← 【a】
  else
    hi ← mid
  endif
endwhile
  1. Amid
  2. Bmid − 1
  3. Cmid + 1
查看答案與解析

正確答案:C. mid + 1

若 data[mid] < x,則 data[mid] 及其之前的元素都小於 x,答案在 mid + 1 以後。否則 data[mid] ≧ x,答案在 mid 以前,因此執行 hi ← mid。若為 lo ← mid + 1,範圍每次一定會縮小,lo = hi 的位置就是答案。若為 lo ← mid,當 lo 與 hi 相鄰時 mid = lo,若 data[mid] < x,範圍不會縮小,迴圈不會結束。

  • A. lo 與 hi 相鄰且 data[lo] < x 時,mid 一直等於 lo,範圍不縮小,迴圈不會結束。例如 data = {3, 8, 12, 17, 23, 31}、x = 31 時,會一直停在 lo = 5、hi = 6。
  • B. 會把 lo 退回到答案之前,範圍有時不會縮小。data = {3, 8, 12, 17, 23, 31}、x = 4 時,lo 會變成0,迴圈不會結束。
  • C. 正確。把已知小於 x 的 mid 排除在範圍外,使範圍確實縮小。
練習這個領域 前往領域頁面

相關計算工具

程式設計基礎(虛擬碼追蹤)的其他題目

  1. 以元素數為5的整數型陣列 st 與整數型變數 top 表示堆疊。st 的元素一開始全為0,top 從0開始。push(v) 先把 top 加1再執行 st[top] ← v,pop() 回傳 st[top] 的值後把 top 減1(不改變 st 的元素)。執行下列程式後 top 與 st 為下列何者?
  2. 有一個把元素數為4的字串型陣列 q 環狀使用的佇列。head 與 tail 的初值為1,enq(v) 執行 q[tail] ← v 後再執行 tail ← tail mod 4 + 1,deq() 回傳 q[head] 的值後執行 head ← head mod 4 + 1。執行下列程式時,「E」會存放在 q 的哪個元素?
  3. 下列程式從元素編號1的元素開始,依序走訪以陣列 next 連接元素的鏈結串列並輸出。陣列的元素編號從1開始。next 的值0表示串列的結尾。輸出的值的順序為下列何者?
  4. 下列程式在以陣列 next 連接的鏈結串列 A → C → E → D → B 中,把 val[6] 的「F」插入到「C」(元素編號3)的正後方,再從元素編號1的元素開始依序走訪並輸出。陣列的元素編號從1開始。next 的值0表示串列的結尾。為使輸出為 A, C, F, E, D, B,【a】應填入下列何者?
  5. 下列 for 迴圈每次讓控制變數增加5。執行後 c 的值為下列何者?