給定方法:
int foo(int[] array, int num) {
int i = array.length - 1;
while (i >= 0) {
if (array[i] > num) return i;
i--;
}
return i; // i == -1
}
迴圈結束條件 i >= 0 失效時 i == -1。即 遍歷完所有元素均未發現 array[i] > num。等價於:數組中所有元素 ≤ num (即 max(array) <= num)。
返回 12 意味著:
array.length - 1 >= 12 → 數組長度 ≥ 13。array[12] > num。j > 12 (即 13 .. length-1),array[j] <= num (否則會更早返回更大索引)。綜合:數組長度 ≥ 13,且索引 12 的元素 > num,而所有更高索引元素 ≤ num。
| 返回值 | 必要條件 |
|---|---|
| -1 | ∀k ∈ [0, length-1], array[k] ≤ num |
| 12 | length ≥ 13 ∧ array[12] > num ∧ ∀k ∈ [13, length-1], array[k] ≤ num |
| i (0 ≤ i < length) | array[i] > num ∧ ∀k ∈ [i+1, length-1], array[k] ≤ num |
從右向左查找第一個大於 num 的元素索引 (若無則返回 -1)。這是「最後一個 > num 的位置」。
理解循環不變量與返回條件,即可精準歸納任意返回值場景。