我对以下递归二进制搜索中“输入”“ if条件”的条件有疑问: http://www.fredosaurus.com/notes-cpp/algorithms/searching/rbinarysearch.html
int rBinarySearch(int sortedArray[], int first, int last, int key) {
// function:
// Searches sortedArray[first]..sortedArray[last] for key.
// returns: index of the matching element if it finds key,
// otherwise -(index where it could be inserted)-1.
// parameters:
// sortedArray in array of sorted (ascending) values.
// first, last in lower and upper subscript bounds
// key in value to search for.
// returns:
// index of key, or -insertion_position -1
// if key is not in the array.
if (first <= last) {
int mid = (first + last) / 2; // compute mid point.
if (key == sortedArray[mid])
return mid; // found it.
else if (key < sortedArray[mid])
// Call ourself for the lower part of the array
return rBinarySearch(sortedArray, first, mid-1, key);
else
// Call ourself for the upper part of the array
return rBinarySearch(sortedArray, mid+1, last, key);
}
return -(first + 1); // failed to find key
}
具体来说,我对if (first <= last)
部分有疑问。
我试图手动跟踪上述递归函数的步骤。例如,我写下一个说[2, 5, 7, 11, 21, 26, 27, 36, 37, 42]
的数组,然后让key
为1
,即key = 1
。
然后在第一次递归中,我认为是我的first = 0
和last = 9
。
因此,mid = (0 + 9)/2 = 4.5
(但由于4
被分配为int,所以中点将为mid
。
所以mid[4] > 1
,所以我的下一个递归是(arr[], 0, 4-1=3, 1)
,.....依此类推.....
但是似乎没有出现last < first
的情况。我只是想知道last < first
的情况真的有可能发生吗? (即,条件if (first <=last)
是否必要?)
如果有必要,有人可以举一个非常简单的例子说明我是否可以理解这个条件吗?
谢谢
答案 0 :(得分:0)
如果您要查找的元素不是您要搜索的数组的元素,那么该条件是停止条件。
在您的示例中,如果您进一步练习它,则递归调用将为
// first, last
rBinarySearch(arr[], 0, 3, 1); // -> mid = 1 -> else if
rBinarySearch(arr[], 0, 0, 1); // -> mid = 0 -> else if
rBinarySearch(arr[], 0, -1, 1); // there you go: last < first (i.e. -1 < 0)