递归二进制搜索条件

时间:2019-06-02 23:28:07

标签: recursion binary-search

我对以下递归二进制搜索中“输入”“ 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]的数组,然后让key1,即key = 1

然后在第一次递归中,我认为是我的first = 0last = 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)是否必要?)

如果有必要,有人可以举一个非常简单的例子说明我是否可以理解这个条件吗?

谢谢

1 个答案:

答案 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)