为什么这个简单的二进制搜索没有返回正确的中间值,虽然输出正确的中间值?

时间:2015-07-04 06:59:26

标签: c++ c++11 search

表示A = {1,2,3,4}和函数调用b_search(3, 0, arr.size() - 1, arr) //arr being a vector。  当我在函数内打印mid时,它返回2,但当我返回mid代替打印mid时,它返回值0.

int b_search(int tbs, int p, int q, vector<int> A){
    if (p < q) {
      int mid = p + (q - p) / 2;
      if (A[mid] == tbs){
         return mid;
      } else if (tbs < A[mid]) {
         b_search(tbs, 0, mid - 1, A);
      } else {
         b_search(tbs, mid + 1, q, A);
      }
   }
}

1 个答案:

答案 0 :(得分:4)

你应该使用return递归调用。你正在进行递归调用,但是没有收集那些递归调用返回的值。你假设后续调用(递归)将返回main的答案但是它会继续将ans返回到您正在进行递归调用的位置。在这一点上,您应该收集答案并将其返回到main。

else if(tbs<A[mid]){
     return b_search(tbs,p,mid-1,A);//note the return
  }else{
     return b_search(tbs,mid+1,q,A);//note the return

也应该是

        b_search(tbs,p,mid-1,A) 

而不是

        b_search(tbs,0,mid-1,A)