循环边界与循环不变式 — 软件工程选择题
题目
某非降序数组 a[1..n] 另设哨兵 a[0] = -∞、a[n+1] = +∞。下列伪代码求最后一个满足 a[i] ≤ x 的下标:
lo ← 0; hi ← n
while lo < hi:
mid ← ⌊(lo + hi + 1)/2⌋
if a[mid] ≤ x:
lo ← mid
else:
hi ← mid - 1
return lo
下列哪一项是该循环的循环不变式(每次迭代开始前均成立,并保证终止时返回值正确)?
A. a[lo] ≤ x < a[hi]
B. a[lo] ≤ x < a[hi+1] 且 lo = hi
C. 0 ≤ lo ≤ hi ≤ n 且 a[lo] ≤ x < a[hi+1]
D. 0 ≤ lo ≤ hi ≤ n 且 a[lo] > x ≥ a[hi+1]